SnowConvert : Requêtes Transact

SELECT

Applies to
  • [x] SQL Server

  • [x] Azure Synapse Analytics

Note

Les jeux de résultats multiples sont renvoyés dans des tables temporaires

Description

Snowflake SQL prend en charge le retour des tables comme type de retour pour les procédures stockées, mais contrairement à Transact-SQL, Snowflake ne prend pas en charge le retour de plusieurs jeux de résultats dans la même procédure. Pour ce scénario, tous les IDs de requête sont stockés dans une table temporaire et renvoyés sous forme de tableau.

Échantillons de modèles de sources

L’exemple suivant détaille la transformation lorsqu’il n’y a qu’une seule instruction SELECT dans la procédure.

Transact-SQL

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

DepartmentID

Nom

GroupName

1

Engineering

Recherche et développement

2

Conception d’outils

Recherche et développement

3

Sales

Ventes et marketing

4

Marketing

Ventes et marketing

5

Achats

Gestion des stocks

6

Recherche et développement

Recherche et développement

7

Production

Fabrication

8

Contrôle de la production

Fabrication

9

Ressources humaines

Exécution générale et administration

10

Finances

Exécution générale et administration

11

Services d’information

Exécution générale et administration

12

Contrôle des documents

Assurance qualité

13

Assurance qualité

Assurance qualité

14

Installations et entretien

Exécution générale et administration

15

Expédition et réception

Gestion des stocks

16

Exécution

Exécution générale et 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

Nom

GroupName

1

Engineering

Recherche et développement

2

Conception d’outils

Recherche et développement

3

Sales

Ventes et marketing

4

Marketing

Ventes et marketing

5

Achats

Gestion des stocks

6

Recherche et développement

Recherche et développement

7

Production

Fabrication

8

Contrôle de la production

Fabrication

9

Ressources humaines

Exécution générale et administration

10

Finances

Exécution générale et administration

11

Services d’information

Exécution générale et administration

12

Contrôle des documents

Assurance qualité

13

Assurance qualité

Assurance qualité

14

Installations et entretien

Exécution générale et administration

15

Expédition et réception

Gestion des stocks

16

Exécution

Exécution générale et administration

L’exemple suivant détaille la transformation lorsqu’il y a de nombreuses instructions SELECT dans la procédure.

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

DepartmentID

Nom

GroupName

1

Engineering

Recherche et développement

2

Conception d’outils

Recherche et développement

3

Sales

Ventes et marketing

4

Marketing

Ventes et marketing

5

Achats

Gestion des stocks

6

Recherche et développement

Recherche et développement

7

Production

Fabrication

8

Contrôle de la production

Fabrication

9

Ressources humaines

Exécution générale et administration

10

Finances

Exécution générale et administration

11

Services d’information

Exécution générale et administration

12

Contrôle des documents

Assurance qualité

13

Assurance qualité

Assurance qualité

14

Installations et entretien

Exécution générale et administration

15

Expédition et réception

Gestion des stocks

16

Exécution

Exécution générale et administration

ShiftID

Nom

StartTime

EndTime

ModifiedDate

1

Jour

07:00:00

15:00:00

2008-04-30 00:00:00.000

2

Soirée

15:00:00

23:00:00

2008-04-30 00:00:00.000

3

Nuit

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

Nom

GroupName

1

Engineering

Recherche et développement

2

Conception d’outils

Recherche et développement

3

Sales

Ventes et marketing

4

Marketing

Ventes et marketing

5

Achats

Gestion des stocks

6

Recherche et développement

Recherche et développement

7

Production

Fabrication

8

Contrôle de la production

Fabrication

9

Ressources humaines

Exécution générale et administration

10

Finances

Exécution générale et administration

11

Services d’information

Exécution générale et administration

12

Contrôle des documents

Assurance qualité

13

Assurance qualité

Assurance qualité

14

Installations et entretien

Exécution générale et administration

15

Expédition et réception

Gestion des stocks

16

Exécution

Exécution générale et administration

ShiftID

Nom

StartTime

EndTime

ModifiedDate

1

Jour

07:00:00

15:00:00

2008-04-30 00:00:00.000

2

Soirée

15:00:00

23:00:00

2008-04-30 00:00:00.000

3

Nuit

23:00:00

07:00:00

2008-04-30 00:00:00.000

Problèmes connus

  1. Les résultats de la requête doivent être accessibles avec les IDs renvoyés par la procédure stockée

TOP

Applies to
  • [x] SQL Server

  • [x] Azure Synapse Analytics

Description

Note

Certaines parties du code de sortie sont omises pour des raisons de clarté.

Limite les lignes renvoyées dans un jeu de résultats de requête à un nombre de lignes ou à un pourcentage de lignes spécifié. Lorsque vous utilisez TOP avec la clause ORDER BY, le jeu de résultats est limité au premier N nombre de lignes ordonnées. Sinon, TOP renvoie le premier _ N _ nombre de lignes dans un ordre indéfini. Utilisez cette clause pour spécifier le nombre de lignes renvoyées par une instruction SELECT. Vous pouvez également utiliser TOP pour spécifier les lignes affectées par une instruction INSERT, UPDATE, MERGE ou DELETE. (Documentation sur Transact-SQL TOP)

Syntaxe dans Transact-SQL

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

Note

Pour obtenir plus d’informations sur les arguments de TOP, veuillez consulter la documentation sur Transact-SQL TOP.

Syntaxe dans Snowflake
 TOP <n> 
Copy

Note

Pour obtenir plus d’informations sur les arguments de TOP, veuillez consulter la documentation sur Snowflake TOP.

Modèles d’échantillons de sources

Pour exécuter correctement les échantillons suivants, il est nécessaire d’exécuter l’instruction CREATE TABLE suivante :

 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

Cas courant

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 utilisant 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

Avertissement

Comme l’argument PERCENT n’est pas pris en charge par Snowflake, il est supprimé de la clause TOP, c’est pourquoi le résultat de l’exécution de la requête dans Snowflake n’est pas équivalent à 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

Avertissement

Comme l’argument WITH TIES n’est pas pris en charge par Snowflake, il est supprimé de la clause TOP, c’est pourquoi le résultat de l’exécution de la requête dans Snowflake n’est pas équivalent à Transact-SQL.

Problèmes connus

1. PERCENT argument is not supported by Snowflake

L’argument PERCENT n’étant pas pris en charge par Snowflake, il est supprimé de la clause TOP et un avertissement est ajouté. Des erreurs d’équivalence fonctionnelle peuvent survenir dans les résultats.

2. WITH TIES argument is not supported by Snowflake

L’argument WITH TIES n’étant pas pris en charge par Snowflake, il est supprimé de la clause TOP et un avertissement est ajouté. Des erreurs d’équivalence fonctionnelle peuvent survenir dans les résultats.

EWIs connexes

  1. SSC-EWI-0040 : Instruction non prise en charge.