SnowConvert: Consultas Transact

SELECT

Applies to
  • [x] SQL Server

  • [x] Azure Synapse Analytics

Nota

Vários conjuntos de resultados são retornados em tabelas temporárias

Descrição

O Snowflake SQL suporta o retorno de tabelas como um tipo de retorno para procedimentos armazenados, mas, diferentemente do Transact SQL, o Snowflake não suporta o retorno de vários conjuntos de resultados no mesmo procedimento. Nesse cenário, todas as IDs de consulta são armazenadas em uma tabela temporária e retornadas como uma matriz.

Amostra de padrões de origem

O exemplo a seguir detalha a transformação quando há apenas uma instrução SELECT no procedimento.

Transact-SQL

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

DepartmentID

Nome

GroupName

1

Engenharia

Pesquisa e desenvolvimento

2

Projeto de ferramentas

Pesquisa e desenvolvimento

3

Vendas

Vendas e marketing

4

Marketing

Vendas e marketing

5

Compras

Gerenciamento de Inventário

6

Pesquisa e desenvolvimento

Pesquisa e desenvolvimento

7

Produção

Fabricação

8

Controle de produção

Fabricação

9

Recursos Humanos

Executivo Geral e Administração

10

Finance

Executivo Geral e Administração

11

Serviços de informação

Executivo Geral e Administração

12

Controle de documentos

Garantia de Qualidade

13

Garantia de Qualidade

Garantia de Qualidade

14

Instalações e manutenção

Executivo Geral e Administração

15

Expedição e recebimento

Gerenciamento de Inventário

16

Executivo

Executivo Geral e Administração

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

Nome

GroupName

1

Engenharia

Pesquisa e desenvolvimento

2

Projeto de ferramentas

Pesquisa e desenvolvimento

3

Vendas

Vendas e marketing

4

Marketing

Vendas e marketing

5

Compras

Gerenciamento de Inventário

6

Pesquisa e desenvolvimento

Pesquisa e desenvolvimento

7

Produção

Fabricação

8

Controle de produção

Fabricação

9

Recursos Humanos

Executivo Geral e Administração

10

Finance

Executivo Geral e Administração

11

Serviços de informação

Executivo Geral e Administração

12

Controle de documentos

Garantia de Qualidade

13

Garantia de Qualidade

Garantia de Qualidade

14

Instalações e manutenção

Executivo Geral e Administração

15

Expedição e recebimento

Gerenciamento de Inventário

16

Executivo

Executivo Geral e Administração

O exemplo a seguir detalha a transformação quando há muitas instruções SELECT no procedimento.

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

DepartmentID

Nome

GroupName

1

Engenharia

Pesquisa e desenvolvimento

2

Projeto de ferramentas

Pesquisa e desenvolvimento

3

Vendas

Vendas e marketing

4

Marketing

Vendas e marketing

5

Compras

Gerenciamento de Inventário

6

Pesquisa e desenvolvimento

Pesquisa e desenvolvimento

7

Produção

Fabricação

8

Controle de produção

Fabricação

9

Recursos Humanos

Executivo Geral e Administração

10

Finance

Executivo Geral e Administração

11

Serviços de informação

Executivo Geral e Administração

12

Controle de documentos

Garantia de Qualidade

13

Garantia de Qualidade

Garantia de Qualidade

14

Instalações e manutenção

Executivo Geral e Administração

15

Expedição e recebimento

Gerenciamento de Inventário

16

Executivo

Executivo Geral e Administração

ShiftID

Nome

StartTime

EndTime

ModifiedDate

1

Day

07:00:00

15:00:00

2008-04-30 00:00:00.000

2

Evening

15:00:00

23:00:00

2008-04-30 00:00:00.000

3

Night

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

Nome

GroupName

1

Engenharia

Pesquisa e desenvolvimento

2

Projeto de ferramentas

Pesquisa e desenvolvimento

3

Vendas

Vendas e marketing

4

Marketing

Vendas e marketing

5

Compras

Gerenciamento de Inventário

6

Pesquisa e desenvolvimento

Pesquisa e desenvolvimento

7

Produção

Fabricação

8

Controle de produção

Fabricação

9

Recursos Humanos

Executivo Geral e Administração

10

Finance

Executivo Geral e Administração

11

Serviços de informação

Executivo Geral e Administração

12

Controle de documentos

Garantia de Qualidade

13

Garantia de Qualidade

Garantia de Qualidade

14

Instalações e manutenção

Executivo Geral e Administração

15

Expedição e recebimento

Gerenciamento de Inventário

16

Executivo

Executivo Geral e Administração

ShiftID

Nome

StartTime

EndTime

ModifiedDate

1

Day

07:00:00

15:00:00

2008-04-30 00:00:00.000

2

Evening

15:00:00

23:00:00

2008-04-30 00:00:00.000

3

Night

23:00:00

07:00:00

2008-04-30 00:00:00.000

Problemas conhecidos

  1. Os resultados da consulta devem ser acessados usando IDs retornados pelo procedimento armazenado

TOP

Applies to
  • [x] SQL Server

  • [x] Azure Synapse Analytics

Descrição

Nota

Algumas partes do código de saída foram omitidas por motivos de clareza.

Limita as linhas retornadas em um conjunto de resultados de consulta a um número especificado de linhas ou a uma porcentagem de linhas. Quando você usa TOP com a cláusula ORDER BY, o conjunto de resultados é limitado ao primeiro número N de linhas ordenadas. Caso contrário, TOP retorna o primeiro _ N _ número de linhas em uma ordem indefinida. Use essa cláusula para especificar o número de linhas retornadas de uma instrução SELECT. Ou use TOP para especificar as linhas afetadas por uma instrução INSERT, UPDATE, MERGE ou DELETE. (Documentação do Transact-SQL TOP)

Sintaxe no Transact-SQL

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

Nota

Para obter mais informações sobre os argumentos de TOP, consulte a documentação do Transact-SQL TOP.

Sintaxe no Snowflake
 TOP <n> 
Copy

Nota

Para obter mais informações sobre os argumentos de TOP, consulte a documentação do Snowflake TOP.

Amostra de padrões da origem

Para executar corretamente os exemplos a seguir, é necessário executar a próxima instrução CREATE TABLE:

 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

Caso comum

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

Aviso

Como o argumento PERCENT não é suportado pelo Snowflake, ele está sendo removido da cláusula TOP, por isso o resultado da execução da consulta no Snowflake não é equivalente ao 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

Aviso

Como o argumento WITH TIES não é suportado pelo Snowflake, ele está sendo removido da cláusula TOP, por isso o resultado da execução da consulta no Snowflake não é equivalente ao Transact-SQL.

Problemas conhecidos

1. PERCENT argument is not supported by Snowflake

Como o argumento PERCENT não é suportado pelo Snowflake, ele está sendo removido da cláusula TOP e um aviso está sendo adicionado. Podem ocorrer incompatibilidades de equivalência funcional nos resultados.

2. WITH TIES argument is not supported by Snowflake

Como o argumento WITH TIES não é suportado pelo Snowflake, ele está sendo removido da cláusula TOP e um aviso está sendo adicionado. Podem ocorrer incompatibilidades de equivalência funcional nos resultados.

EWIs relacionados

  1. SSC-EWI-0040: Instrução não suportada.