SnowConvert: Transact Abfragen

SELECT

Applies to
  • [x] SQL Server

  • [x] Azure Synapse Analytics

Bemerkung

Mehrere Resultsets werden in temporären Tabellen zurückgegeben

Beschreibung

Snowflake SQL unterstützt die Rückgabe von Tabellen in als Rückgabetyp gespeicherte Prozeduren, aber im Gegensatz zu Transact-SQL unterstützt Snowflake nicht die Rückgabe mehrerer Resultsets in derselben Prozedur. Bei diesem Szenario werden alle Abfrage-IDs in einer temporären Tabelle gespeichert und als Array zurückgegeben.

Beispielhafte Quellcode-Muster

Das folgende Beispiel beschreibt die Transformation, wenn es nur eine SELECT-Anweisung in der Prozedur gibt.

Transact-SQL

 CREATE PROCEDURE SOMEPROC()
AS
BEGIN
        SELECT * from AdventureWorks.HumanResources.Department;
END
Copy

DepartmentID

Name

GroupName

1

Engineering

Research and Development

2

Tool Design

Research and Development

3

Sales

Sales and Marketing

4

Marketing

Sales and Marketing

5

Purchasing

Inventory Management

6

Research and Development

Research and Development

7

Produktion

Manufacturing

8

Production Control

Manufacturing

9

Human Resources

Executive General and Administration

10

Finanzen

Executive General and Administration

11

Information Services

Executive General and Administration

12

Document Control

Quality Assurance

13

Quality Assurance

Quality Assurance

14

Facilities and Maintenance

Executive General and Administration

15

Shipping and Receiving

Inventory Management

16

Executive

Executive General and Administration

Snowflake SQL
 CREATE OR REPLACE PROCEDURE SOMEPROC ()
RETURNS TABLE()
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
EXECUTE AS CALLER
AS
$$
        DECLARE
                ProcedureResultSet RESULTSET;
        BEGIN
                ProcedureResultSet := (
                SELECT
                        *
                from
                        AdventureWorks.HumanResources.Department);
                RETURN TABLE(ProcedureResultSet);
        END;
$$;
Copy

DepartmentID

Name

GroupName

1

Engineering

Research and Development

2

Tool Design

Research and Development

3

Sales

Sales and Marketing

4

Marketing

Sales and Marketing

5

Purchasing

Inventory Management

6

Research and Development

Research and Development

7

Produktion

Manufacturing

8

Production Control

Manufacturing

9

Human Resources

Executive General and Administration

10

Finanzen

Executive General and Administration

11

Information Services

Executive General and Administration

12

Document Control

Quality Assurance

13

Quality Assurance

Quality Assurance

14

Facilities and Maintenance

Executive General and Administration

15

Shipping and Receiving

Inventory Management

16

Executive

Executive General and Administration

Das folgende Beispiel beschreibt die Transformation, wenn es viele SELECT-Anweisungen in der Prozedur gibt.

Transact-SQL
 CREATE PROCEDURE SOMEPROC()
AS
BEGIN
        SELECT * from AdventureWorks.HumanResources.Department;
        SELECT * from AdventureWorks.HumanResources.Shift;
END
Copy

DepartmentID

Name

GroupName

1

Engineering

Research and Development

2

Tool Design

Research and Development

3

Sales

Sales and Marketing

4

Marketing

Sales and Marketing

5

Purchasing

Inventory Management

6

Research and Development

Research and Development

7

Produktion

Manufacturing

8

Production Control

Manufacturing

9

Human Resources

Executive General and Administration

10

Finanzen

Executive General and Administration

11

Information Services

Executive General and Administration

12

Document Control

Quality Assurance

13

Quality Assurance

Quality Assurance

14

Facilities and Maintenance

Executive General and Administration

15

Shipping and Receiving

Inventory Management

16

Executive

Executive General and Administration

ShiftID

Name

StartTime

EndTime

ModifiedDate

1

Tag

07:00:00

15:00:00

2008-04-30 00:00:00,000

2

Abend

15:00:00

23:00:00

2008-04-30 00:00:00,000

3

Nacht

23:00:00

07:00:00

2008-04-30 00:00:00,000

Snowflake SQL
 CREATE OR REPLACE PROCEDURE SOMEPROC ()
RETURNS ARRAY
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
EXECUTE AS CALLER
AS
$$
        DECLARE
                ProcedureResultSet1 VARCHAR;
                ProcedureResultSet2 VARCHAR;
                return_arr ARRAY := array_construct();
        BEGIN
                ProcedureResultSet1 := 'RESULTSET_' || REPLACE(UPPER(UUID_STRING()), '-', '_');
                CREATE OR REPLACE TEMPORARY TABLE IDENTIFIER(:ProcedureResultSet1) AS
                        SELECT
                                *
                        from
                                AdventureWorks.HumanResources.Department;
                return_arr := array_append(return_arr, :ProcedureResultSet1);
                ProcedureResultSet2 := 'RESULTSET_' || REPLACE(UPPER(UUID_STRING()), '-', '_');
                CREATE OR REPLACE TEMPORARY TABLE IDENTIFIER(:ProcedureResultSet2) AS
                        SELECT
                                *
                        from
                                AdventureWorks.HumanResources.Shift;
                return_arr := array_append(return_arr, :ProcedureResultSet2);
                --** SSC-FDM-0020 - MULTIPLE RESULT SETS ARE RETURNED IN TEMPORARY TABLES **
                RETURN return_arr;
        END;
$$;
Copy

DepartmentID

Name

GroupName

1

Engineering

Research and Development

2

Tool Design

Research and Development

3

Sales

Sales and Marketing

4

Marketing

Sales and Marketing

5

Purchasing

Inventory Management

6

Research and Development

Research and Development

7

Produktion

Manufacturing

8

Production Control

Manufacturing

9

Human Resources

Executive General and Administration

10

Finanzen

Executive General and Administration

11

Information Services

Executive General and Administration

12

Document Control

Quality Assurance

13

Quality Assurance

Quality Assurance

14

Facilities and Maintenance

Executive General and Administration

15

Shipping and Receiving

Inventory Management

16

Executive

Executive General and Administration

ShiftID

Name

StartTime

EndTime

ModifiedDate

1

Tag

07:00:00

15:00:00

2008-04-30 00:00:00,000

2

Abend

15:00:00

23:00:00

2008-04-30 00:00:00,000

3

Nacht

23:00:00

07:00:00

2008-04-30 00:00:00,000

Bekannte Probleme

  1. Auf die Abfrageergebnisse sollten Sie über die IDs zugreifen, die von der gespeicherten Prozedur zurückgegeben wird

TOP

Applies to
  • [x] SQL Server

  • [x] Azure Synapse Analytics

Beschreibung

Bemerkung

Einige Teile des Ausgabecodes wurden aus Gründen der Übersichtlichkeit weggelassen.

Schränkt die in einem Resultset der Abfrage zurückgegebenen Zeilen auf eine bestimmte Anzahl von Zeilen oder einen bestimmten Prozentsatz von Zeilen ein. Wenn Sie TOP mit der ORDER BY-Klausel verwenden, ist das Resultset auf die erste N Anzahl der geordneten Zeilen beschränkt. Andernfalls gibt TOP die erste _ N _ Anzahl von Zeilen in einer undefinierten Reihenfolge zurück. Verwenden Sie diese Klausel, um die Anzahl der Zeilen anzugeben, die von einer SELECT -Anweisung zurückgegeben werden. Oder verwenden Sie TOP, um die Zeilen anzugeben, die von einer INSERT-, UPDATE-, MERGE- oder DELETE-Anweisung betroffen sind. (Transact-SQL TOP-Dokumentation)

Syntax in Transact-SQL

 TOP (expression) [PERCENT] [ WITH TIES ]
Copy

Bemerkung

Weitere Informationen zu den TOP-Argumenten finden Sie in der Transact-SQL TOP-Dokumentation.

Syntax in Snowflake
 TOP <n> 
Copy

Bemerkung

Weitere Informationen über TOP Argumente finden Sie in der TOP-Dokumentation von Snowflake.

Beispielhafte Quellcode-Muster

Um die folgenden Beispiele korrekt auszuführen, ist es erforderlich, die folgende CREATE TABLE-Anweisung auszuführen:

 CREATE TABLE Cars(
    Model VARCHAR(15), 
    Price MONEY, 
    Color VARCHAR(10)
);

INSERT Cars VALUES ('sedan', 10000, 'red'), 
('convertible', 15000, 'blue'),
('coupe', 20000, 'red'), 
('van', 8000, 'blue'),
('sub', 8000, 'green');
Copy
 CREATE OR REPLACE TABLE Cars (
    Model VARCHAR(15),
    Price NUMBER(38, 4),
    Color VARCHAR(10)
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
;

INSERT INTO Cars VALUES ('sedan', 10000, 'red'),
('convertible', 15000, 'blue'),
('coupe', 20000, 'red'),
('van', 8000, 'blue'),
('sub', 8000, 'green');
Copy

Allgemeiner Fall

Transact-SQL
 SELECT TOP(1) Model, Color, Price
FROM Cars
WHERE Color = 'red'
Copy
Model | Color | Price
--------------------------
sedan |  red  | 10000.0000


Copy
Snowflake
 SELECT
TOP 1
Model,
Color,
Price
FROM
Cars
WHERE
Color = 'red';
Copy
MODEL	COLOR	PRICE
sedan	red	10,000

Copy

TOP mit PERCENT

Transact-SQL
 SELECT TOP(50)PERCENT Model, Color, Price FROM Cars
Copy
Model        |  Color  |  Prices
-----------------------------------
sedan        |  red    |  10000.0000
convertible  |  blue   |  15000.0000
coupe        |  green  |  20000.0000

Copy
Snowflake
 SELECT
TOP 50 !!!RESOLVE EWI!!! /*** SSC-EWI-0040 - THE STATEMENT IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
Model,
Color,
Price
FROM
Cars;
Copy
MODEL	         COLOR        PRICE
sedan	         red          10,000
convertible      blue         15,000
coupe	         red          20,000
van	         blue         8,000
sub              green        8,000

Copy

Warnung

Da das Argument PERCENT von Snowflake nicht unterstützt wird, wird es aus der TOP-Klausel entfernt. Deshalb ist das Ergebnis der Ausführung der Abfrage in Snowflake nicht gleichwertig mit Transact-SQL.

TOP WITH TIES

Transact-SQL
 SELECT TOP(50)PERCENT WITH TIES Model, Color, Price FROM Cars ORDER BY Price;
Copy
Model  |  Color   | Price
-------------------------------
van    |  blue    | 8000.0000
sub    |  green   | 8000.0000
sedan  |  red     | 10000.0000


Copy
Snowflake
 SELECT
TOP 50 !!!RESOLVE EWI!!! /*** SSC-EWI-0040 - THE STATEMENT IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
Model,
Color,
Price
FROM
Cars
ORDER BY Price;
Copy
MODEL	        COLOR	    PRICE
sub	        green	    8,000
van	        blue	    8,000
sedan	        red	    10,000
convertible     blue	    15,000
coupe	        red	    20,000

Copy

Warnung

Da das Argument WITH TIES von Snowflake nicht unterstützt wird, wird es aus der TOP-Klausel entfernt. Deshalb ist das Ergebnis der Ausführung der Abfrage in Snowflake nicht gleichwertig mit Transact-SQL.

Bekannte Probleme

1. PERCENT argument is not supported by Snowflake

Da das PERCENT-Argument von Snowflake nicht unterstützt wird, wird es aus der TOP-Klausel entfernt und eine Warnung hinzugefügt. Bei den Ergebnissen kann es zu Funktionsäquivalenzfehlern kommen.

2. WITH TIES argument is not supported by Snowflake

Da das WITH TIES-Argument von Snowflake nicht unterstützt wird, wird es aus der TOP-Klausel entfernt und eine Warnung hinzugefügt. Bei den Ergebnissen kann es zu Funktionsäquivalenzfehlern kommen.

Zugehörige EWIs

  1. [SSC-EWI-0040](../../general/technical-documentation/issues-and-troubleshooting/conversion-issues/generalEWI. md#ssc-ewi-0040): Anweisung wird nicht unterstützt.