SnowConvert AI - SQL Server - CREATE FUNCTION¶
Referência de tradução para funções definidas pelo usuário do Transact-SQL
Applies to
SQL Server
Azure Synapse Analytics
Descrição¶
O SQL Server suporta apenas dois tipos de Funções Definidas pelo Usuário:
Usando esses tipos de UDFs, é possível subcategorizá-los em simples e complexos, de acordo com a lógica interna.
UDFs simples, corresponde a sintaxe do SQL Server à sintaxe do Snowflake. Este tipo não adiciona nenhuma lógica e vai direto para o resultado. Estes são geralmente correspondentes a UDFs SQL do Snowflake. SnowConvert é compatível com a tradução de funções escalares definidas pelo usuário do SQL Server diretamente para UDFs do Script Snowflake quando cumprem critérios específicos.\ \ UDFs complexas, faz uso extensivo de determinadas instruções (INSERT, DELETE, UPDATE, SET, DECLARE, etc) ou control-of-flow bloqueia (IF…ELSE, WHILE, etc) e geralmente representa uma incompatibilidade ou violação da definição de UDFs SQL do Snowflake.
Limitações¶
Transact UDFs têm algumas limitações que não estão presentes em outros mecanismos de banco de dados (como Oracle e Teradata). Essas limitações ajudam as conversões ao restringirem o escopo da falha. Isso significa que há cenários específicos que podemos esperar evitar.
Aqui estão algumas das limitações que o SQL Server tem sobre UDFs
UDFs não podem ser usados para executar ações que modifiquem o estado do banco de dados
As funções definidas pelo usuário não podem conter uma cláusula OUTPUT INTO que tenha uma tabela como destino
As funções definidas pelo usuário não podem retornar vários conjuntos de resultados. Use um procedimento armazenado se você precisar retornar vários conjuntos de resultados.
Para obter a lista completa, consulte este link Criar funções definidas pelo usuário (mecanismo de banco de dados)
INLINE TABLE-VALUED¶
Referência de tradução para converter UDF (funções definidas pelo usuário) do Transact-SQL com o tipo de retorno TABLE em Snowflake.
Applies to
SQL Server
Azure Synapse Analytics
Descrição¶
Nota
Algumas partes do código de saída foram omitidas por motivos de clareza.
As funções Inline Table-Valued são expressões de tabela que podem aceitar parâmetros, executar uma instrução SELECT e retornar um TABLE (Referência da linguagem SQL Server - Criar uma função Inline Table-Valued).
Sintaxe do Transact¶
Sintaxe do Snowflake SQL¶
Amostra de padrões da origem¶
A seção a seguir descreve todos os possíveis padrões de código-fonte que podem aparecer nesse tipo de sintaxe CREATE FUNCTION.
Para funções Inline Table-Valued, só pode haver uma instrução por corpo, que pode ser:
Instrução
SELECTExpressão de tabela comum
WITH
Selecionar e retornar valores diretamente de uma tabela¶
Este é o cenário mais simples, executando uma seleção simples de uma tabela e retornando esses valores
Transact-SQL¶
com valor de tabela inline¶
Resultado¶
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¶
com valor de tabela inline¶
Resultado¶
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 |
Selecionar e retornar valores de várias tabelas renomeando colunas e usando funções incorporadas¶
Este é um exemplo de uma consulta que usa funções internas em uma instrução Select, obtendo dados de diferentes tabelas, renomeando colunas e retornando uma tabela.
Transact-SQL¶
com valor de tabela inline¶
Resultado¶
PersonType |
FirstName |
JobTitle |
Gênero |
HIREYEAR |
|---|---|---|---|---|
EM |
Ken |
Diretor executivo |
M |
2009 |
EM |
Terri |
Vice-presidente de engenharia |
F |
2008 |
EM |
Roberto |
Gerente de engenharia |
M |
2007 |
EM |
Rob |
Desenvolvedor de ferramentas sênior |
M |
2007 |
EM |
Gail |
Engenheiro de design |
F |
2008 |
EM |
Jossef |
Engenheiro de design |
M |
2008 |
EM |
Dylan |
Gerente de pesquisa e desenvolvimento |
M |
2009 |
EM |
Diane |
Engenheira de pesquisa e desenvolvimento |
F |
2008 |
EM |
Gigi |
Engenheira de pesquisa e desenvolvimento |
F |
2009 |
EM |
Michael |
Gerente de pesquisa e desenvolvimento |
M |
2009 |
EM |
Ovidiu |
Desenvolvedor de ferramentas sênior |
M |
2010 |
EM |
Thierry |
Designer de ferramentas |
M |
2007 |
EM |
Janice |
Designer de ferramentas |
F |
2010 |
EM |
Michael |
Engenheira de design sênior |
M |
2010 |
EM |
Sharon |
Engenheiro de design |
F |
2011 |
EM |
David |
Gerente de marketing |
M |
2007 |
EM |
Kevin |
Assistente de marketing |
M |
2007 |
EM |
John |
Especialista de marketing |
M |
2011 |
EM |
Mary |
Assistente de marketing |
F |
2011 |
EM |
Wanida |
Assistente de marketing |
F |
2011 |
Snowflake SQL¶
com valor de tabela inline¶
Resultado¶
PersonType |
FirstName |
JobTitle |
Gênero |
HIREYEAR |
|---|---|---|---|---|
EM |
Ken |
Diretor executivo |
M |
2009 |
EM |
Terri |
Vice-presidente de engenharia |
F |
2008 |
EM |
Roberto |
Gerente de engenharia |
M |
2007 |
EM |
Rob |
Desenvolvedor de ferramentas sênior |
M |
2007 |
EM |
Gail |
Engenheiro de design |
F |
2008 |
EM |
Jossef |
Engenheiro de design |
M |
2008 |
EM |
Dylan |
Gerente de pesquisa e desenvolvimento |
M |
2009 |
EM |
Diane |
Engenheira de pesquisa e desenvolvimento |
F |
2008 |
EM |
Gigi |
Engenheira de pesquisa e desenvolvimento |
F |
2009 |
EM |
Michael |
Gerente de pesquisa e desenvolvimento |
M |
2009 |
EM |
Ovidiu |
Desenvolvedor de ferramentas sênior |
M |
2010 |
EM |
Thierry |
Designer de ferramentas |
M |
2007 |
EM |
Janice |
Designer de ferramentas |
F |
2010 |
EM |
Michael |
Engenheira de design sênior |
M |
2010 |
EM |
Sharon |
Engenheiro de design |
F |
2011 |
EM |
David |
Gerente de marketing |
M |
2007 |
EM |
Kevin |
Assistente de marketing |
M |
2007 |
EM |
John |
Especialista de marketing |
M |
2011 |
EM |
Mary |
Assistente de marketing |
F |
2011 |
EM |
Wanida |
Assistente de marketing |
F |
2011 |
Selecionar colunas usando a instrução WITH¶
O corpo de uma função com valor de tabela em linha também pode ser especificado usando uma instrução WITH, conforme mostrado abaixo.
Transact-SQL¶
com valor de tabela inline¶
Resultado¶
MaritalStatus |
Gênero |
Nome |
|---|---|---|
S |
F |
Terri Duffy |
M |
F |
Gail Erickson |
S |
F |
Diane Margheim |
M |
F |
Gigi Matthew |
M |
F |
Janice Galvin |
M |
F |
Sharon Salavaria |
S |
F |
Mary Dempsey |
M |
F |
Wanida Benshoof |
M |
F |
Mary Gibson |
M |
F |
Jill Williams |
S |
F |
Jo Brown |
M |
F |
Britta Simon |
M |
F |
Margie Shoop |
M |
F |
Rebecca Laszlo |
M |
F |
Suchitra Mohan |
M |
F |
Kim Abercrombie |
S |
F |
JoLynn Dobney |
M |
F |
Nancy Anderson |
M |
F |
Ruth Ellerbrock |
M |
F |
Doris Hartwig |
M |
F |
Diane Glimp |
M |
F |
Bonnie Kearney |
M |
F |
Denise Smith |
S |
F |
Diane Tibbott |
M |
F |
Carole Poland |
M |
F |
Carol Philips |
M |
F |
Merav Netz |
S |
F |
Betsy Stadick |
S |
F |
Danielle Tiedt |
S |
F |
Kimberly Zimmerman |
M |
F |
Elizabeth Keyser |
M |
F |
Mary Baker |
M |
F |
Alice Ciccu |
M |
F |
Linda Moschell |
S |
F |
Angela Barbariol |
S |
F |
Kitti Lertpiriyasuwat |
S |
F |
Susan Eaton |
S |
F |
Kim Ralls |
M |
F |
Nicole Holliday |
S |
F |
Anibal Sousa |
M |
F |
Samantha Smith |
S |
F |
Olinda Turner |
S |
F |
Cynthia Randall |
M |
F |
Sandra Reátegui Alayo |
S |
F |
Linda Randall |
S |
F |
Shelley Dyck |
S |
F |
Laura Steele |
S |
F |
Susan Metters |
S |
F |
Katie McAskill-White |
M |
F |
Barbara Decker |
M |
F |
Yvonne McKay |
S |
F |
Janeth Esteves |
M |
F |
Brenda Diaz |
M |
F |
Lorraine Nay |
M |
F |
Paula Nartker |
S |
F |
Lori Kane |
M |
F |
Kathie Flood |
S |
F |
Belinda Newman |
M |
F |
Karen Berge |
M |
F |
Lori Penor |
M |
F |
Jo Berry |
M |
F |
Laura Norman |
M |
F |
Paula Barreto de Mattos |
M |
F |
Mindy Martin |
M |
F |
Deborah Poe |
S |
F |
Candy Spoon |
M |
F |
Barbara Moreland |
M |
F |
Janet Sheperdigian |
S |
F |
Wendy Kahn |
S |
F |
Sheela Word |
M |
F |
Linda Meisner |
S |
F |
Erin Hagens |
M |
F |
Annette Hill |
S |
F |
Jean Trenary |
S |
F |
Stephanie Conroy |
S |
F |
Karen Berg |
M |
F |
Janaina Bueno |
M |
F |
Linda Mitchell |
S |
F |
Jillian Carson |
S |
F |
Pamela Ansman-Wolfe |
S |
F |
Lynn Tsoflias |
M |
F |
Amy Alberts |
S |
F |
Rachel Valdez |
M |
F |
Jae Pak |
Snowflake SQL¶
com valor de tabela inline¶
Resultado¶
MaritalStatus |
Gênero |
Nome |
|---|---|---|
S |
F |
Terri Duffy |
M |
F |
Gail Erickson |
S |
F |
Diane Margheim |
M |
F |
Gigi Matthew |
M |
F |
Janice Galvin |
M |
F |
Sharon Salavaria |
S |
F |
Mary Dempsey |
M |
F |
Wanida Benshoof |
M |
F |
Mary Gibson |
M |
F |
Jill Williams |
S |
F |
Jo Brown |
M |
F |
Britta Simon |
M |
F |
Margie Shoop |
M |
F |
Rebecca Laszlo |
M |
F |
Suchitra Mohan |
M |
F |
Kim Abercrombie |
S |
F |
JoLynn Dobney |
M |
F |
Nancy Anderson |
M |
F |
Ruth Ellerbrock |
M |
F |
Doris Hartwig |
M |
F |
Diane Glimp |
M |
F |
Bonnie Kearney |
M |
F |
Denise Smith |
S |
F |
Diane Tibbott |
M |
F |
Carole Poland |
M |
F |
Carol Philips |
M |
F |
Merav Netz |
S |
F |
Betsy Stadick |
S |
F |
Danielle Tiedt |
S |
F |
Kimberly Zimmerman |
M |
F |
Elizabeth Keyser |
M |
F |
Mary Baker |
M |
F |
Alice Ciccu |
M |
F |
Linda Moschell |
S |
F |
Angela Barbariol |
S |
F |
Kitti Lertpiriyasuwat |
S |
F |
Susan Eaton |
S |
F |
Kim Ralls |
M |
F |
Nicole Holliday |
S |
F |
Anibal Sousa |
M |
F |
Samantha Smith |
S |
F |
Olinda Turner |
S |
F |
Cynthia Randall |
M |
F |
Sandra Reátegui Alayo |
S |
F |
Linda Randall |
S |
F |
Shelley Dyck |
S |
F |
Laura Steele |
S |
F |
Susan Metters |
S |
F |
Katie McAskill-White |
M |
F |
Barbara Decker |
M |
F |
Yvonne McKay |
S |
F |
Janeth Esteves |
M |
F |
Brenda Diaz |
M |
F |
Lorraine Nay |
M |
F |
Paula Nartker |
S |
F |
Lori Kane |
M |
F |
Kathie Flood |
S |
F |
Belinda Newman |
M |
F |
Karen Berge |
M |
F |
Lori Penor |
M |
F |
Jo Berry |
M |
F |
Laura Norman |
M |
F |
Paula Barreto de Mattos |
M |
F |
Mindy Martin |
M |
F |
Deborah Poe |
S |
F |
Candy Spoon |
M |
F |
Barbara Moreland |
M |
F |
Janet Sheperdigian |
S |
F |
Wendy Kahn |
S |
F |
Sheela Word |
M |
F |
Linda Meisner |
S |
F |
Erin Hagens |
M |
F |
Annette Hill |
S |
F |
Jean Trenary |
S |
F |
Stephanie Conroy |
S |
F |
Karen Berg |
M |
F |
Janaina Bueno |
M |
F |
Linda Mitchell |
S |
F |
Jillian Carson |
S |
F |
Pamela Ansman-Wolfe |
S |
F |
Lynn Tsoflias |
M |
F |
Amy Alberts |
S |
F |
Rachel Valdez |
M |
F |
Jae Pak |
Problemas conhecidos¶
Não foram encontrados problemas
MULTI-STATEMENT TABLE-VALUED¶
Referência de tradução para converter UDF (funções definidas pelo usuário) do Transact-SQL com o tipo de retorno TABLE em Snowflake.
Applies to
SQL Server
Azure Synapse Analytics
Nota
Algumas partes do código de saída foram omitidas por motivos de clareza.
Nota
Todos os exemplos de código nesta página ainda não foram implementados no SnowConvert AI. Eles devem ser interpretados como uma referência de como cada cenário deve ser traduzido para o Snowflake. Essas traduções podem mudar no futuro. Algumas partes no código de saída são omitidas por questão de clareza.
Descrição¶
O valor de tabela com várias instruções é semelhante ao valor de tabela com instrução inline (INLINE TABLE-VALUED). Embora o valor de tabela com várias instruções possa ter mais de uma instrução no corpo da função, as colunas da tabela são especificadas no tipo de retorno e ela possui um bloco BEGIN/END (Referência da linguagem SQL Server, Criando uma função com valor de tabela com várias instruções
Sintaxe do Transact-SQL¶
Snowflake SQL¶
Amostra de padrões da origem¶
A seção a seguir descreve todos os possíveis padrões de código-fonte que podem aparecer nesse tipo de sintaxe ofCREATE FUNCTION.
O corpo da função Multi-Statement Table-Valued deve ser uma instrução SELECT. Por esse motivo, as outras instruções devem ser chamadas separadamente.
Inserir valores em uma tabela¶
Insere uma ou mais linhas na tabela e retorna a tabela com os novos valores
Transact-SQL¶
MULTI-STATEMENT TABLE-VALUED¶
Resultado¶
BEHAVIORAL_SEGMENT |
|---|
Desconhecido |
Snowflake SQL¶
MULTI-STATEMENT TABLE-VALUED¶
Resultados¶
BEHAVIORAL_SEGMENT |
|---|
Desconhecido |
Inserir valor de acordo com a instrução if/else¶
Insere uma linha na tabela de acordo com a condição e retorna a tabela com o novo valor
Transact-SQL¶
MULTI-STATEMENT TABLE-VALUED¶
Resultado¶
NUMBER_TYPE |
|---|
ímpar |
Snowflake SQL¶
MULTI-STATEMENT TABLE-VALUED¶
Resultado¶
NUMBER_TYPE |
|---|
ímpar |
Insere múltiplos de acordo com a instrução if/else¶
O exemplo abaixo insere mais de um valor na tabela e mais de uma variável é modificada de acordo com a condição. Retorna a tabela com os novos valores
Transact-SQL¶
MULTI-STATEMENT TABLE-VALUED¶
Resultado¶
ID_EMPLOYEE |
WORKING_FROM_HOME |
TEAM |
COMPUTER |
|---|---|---|---|
123456789 |
1 |
TEAM_1 |
LAPTOP |
Snowflake¶
MULTI-STATEMENT TABLE-VALUED¶
Resultado¶
ID_EMPLOYEE |
WORKING_FROM_HOME |
TEAM |
COMPUTER |
|---|---|---|---|
123456789 |
1 |
TEAM_1 |
LAPTOP |
Aviso
Se houver instruções if aninhadas e mais de uma variável for modificada nas instruções, será necessário usar um procedimento armazenado.
Atualizar valores inseridos anteriormente¶
Atualiza os valores das colunas da tabela no corpo da função e o retorna com os novos valores.
Transact-SQL¶
MULTI-STATEMENT TABLE-VALUED¶
Resultado¶
DEPARTMENT_NAME |
FIRST_NAME |
LAST_NAME |
START_DATE |
END_DATE |
JOB_TITLE |
MONTHS_WORKING |
|---|---|---|---|---|---|---|
Vendas |
Syed |
Abbas |
2013-03-14 |
NULL |
Gerente de vendas do Pacífico |
106 |
Produção |
Kim |
Abercrombie |
2010-01-16 |
NULL |
Técnica de produção - WC60 |
144 |
Garantia de Qualidade |
Hazem |
Abolrous |
2009-02-28 |
NULL |
Gerente de garantia de qualidade |
155 |
Expedição e recebimento |
Pilar |
Ackerman |
2009-01-02 |
NULL |
Supervisor de envio e recebimento |
156 |
Produção |
Jay |
Adams |
2009-03-05 |
NULL |
Técnica de produção - WC60 |
154 |
Serviços de informação |
François |
Ajenstat |
2009-01-17 |
NULL |
Administrador de banco de dados |
156 |
Vendas |
Amy |
Alberts |
2012-04-16 |
NULL |
Gerente de vendas da Europa |
117 |
Produção |
Greg |
Alderson |
2008-12-02 |
NULL |
Técnica de produção - WC45 |
157 |
Garantia de Qualidade |
Sean |
Alexander |
2008-12-28 |
NULL |
Técnico de garantia de qualidade |
157 |
Instalações e manutenção |
Gary |
Altman |
2009-12-02 |
NULL |
Gerente de instalações |
145 |
Snowflake SQL¶
MULTI-STATEMENT TABLE-VALUED¶
Resultado¶
DEPARTMENT_NAME |
FIRST_NAME |
LAST_NAME |
START_DATE |
END_DATE |
JOB_TITLE |
MONTHS_WORKING |
|---|---|---|---|---|---|---|
Vendas |
Syed |
Abbas |
2013-03-14 |
NULL |
Gerente de vendas do Pacífico |
106 |
Produção |
Kim |
Abercrombie |
2010-01-16 |
NULL |
Técnica de produção - WC60 |
144 |
Garantia de Qualidade |
Hazem |
Abolrous |
2009-02-28 |
NULL |
Gerente de garantia de qualidade |
155 |
Expedição e recebimento |
Pilar |
Ackerman |
2009-01-02 |
NULL |
Supervisor de envio e recebimento |
156 |
Produção |
Jay |
Adams |
2009-03-05 |
NULL |
Técnica de produção - WC60 |
154 |
Serviços de informação |
François |
Ajenstat |
2009-01-17 |
NULL |
Administrador de banco de dados |
156 |
Vendas |
Amy |
Alberts |
2012-04-16 |
NULL |
Gerente de vendas da Europa |
117 |
Produção |
Greg |
Alderson |
2008-12-02 |
NULL |
Técnica de produção - WC45 |
157 |
Garantia de Qualidade |
Sean |
Alexander |
2008-12-28 |
NULL |
Técnico de garantia de qualidade |
157 |
Instalações e manutenção |
Gary |
Altman |
2009-12-02 |
NULL |
Gerente de instalações |
145 |
Múltiplas cláusulas de retorno¶
No exemplo a seguir, há mais de uma cláusula de retorno, porque, dependendo da situação, não é necessário continuar executando a função inteira.
Transact-SQL¶
MULTI-STATEMENT TABLE-VALUED¶
Resultado¶
TYPE |
NAME |
|---|---|
SMALL_TEAM |
TEAM1 |
Snowflake SQL¶
MULTI-STATEMENT TABLE-VALUED¶
Resultado¶
TYPE |
NAME |
|---|---|
SMALL_TEAM |
TEAM1 |
Aviso
Essa transformação é aplicada quando há apenas um valor a ser inserido; se houver mais de um valor, será necessário usar um procedimento armazenado.
Casos complexos¶
O exemplo é um caso complexo que usa instruções aninhadas if e insere um valor dependendo da condição verdadeira.
Transact-SQL¶
MULTI-STATEMENT TABLE-VALUED¶
Resultado¶
VACATION_STATUS |
|---|
OK |
Snowflake SQL¶
MULTI-STATEMENT TABLE-VALUED¶
Segunda guia¶
VACATION_STATUS |
|---|
OK |
Problemas conhecidos¶
Instruções while ao lado de consultas¶
O problema com esse exemplo é que não há como transformar a instrução while em CTE dentro da cláusula WITH do Select principal, o que nos força a transformar essa instrução em procedimento armazenado para manter a mesma lógica.
Transact-SQL¶
MULTI-STATEMENT TABLE-VALUED¶
Resultado¶
GROUP_NAME |
|---|
Projeto de ferramentas |
Snowflake SQL¶
MULTI-STATEMENT TABLE-VALUED¶
Resultado¶
GROUP_NAME |
|---|
Projeto de ferramentas |
Declare Cursor¶
As funções definidas pelo usuário não podem DECLARE, OPEN, FETCH, CLOSE ou DEALLOCATE um CURSOR. Use um procedimento armazenado para trabalhar com cursores.
Transact-SQL¶
MULTI-STATEMENT TABLE-VALUED¶
Resultado¶
AMOUNT |
|---|
3 |
Snowflake SQL¶
MULTI-STATEMENT TABLE-VALUED¶
Resultado¶
AMOUNT |
|---|
3 |
Não há suporte para instruções diferentes em Expressões de tabela comuns¶
As cláusulas UPDATE, INSERT, DELETE, ALTER ou DROP não são compatíveis com o corpo de expressões de tabela comuns, mesmo após sua declaração usando um delimitador. Por esse motivo, a função pode ser modificada para funcionar como um procedimento armazenado.
Transact-SQL¶
MULTI-STATEMENT TABLE-VALUED¶
Resultado¶
PRODUCT_NAME |
Classificação |
|---|---|
HL Mountain Pedal |
3 |
Mountain Bike Socks, M |
5 |
Road-550-W Yellow, 40 |
5 |
Snowflake SQL¶
MULTI-STATEMENT TABLE-VALUED¶
Resultado¶
PRODUCT_NAME |
Classificação |
|---|---|
HL Mountain Pedal |
3 |
Mountain Bike Socks, M |
5 |
Road-550-W Yellow, 40 |
5 |
EWIs relacionados¶
SSC-EWI-0040: Instrução incompatível.
SSC-EWI-0073: Revisão de equivalência funcional pendente
SCALAR¶
Referência de tradução para converter UDF (funções definidas pelo usuário) do Transact-SQL com tipo de retorno escalar para o Snowflake.
Applies to
SQL Server
Azure Synapse Analytics
Descrição¶
Nota
Algumas partes do código de saída foram omitidas por motivos de clareza.
Uma função escalar definida pelo usuário é uma rotina Transact-SQL ou tempo de execução de linguagem comum (CLR) que aceita parâmetros, executa uma ação, como um cálculo complexo, e retorna o resultado dessa ação como um valor escalar. (Referência da linguagem SQL Server, subseção ReferenceCREATE FUNCTION).
Nota
Essas funções geralmente são usadas dentro da instrução SELECTou na configuração de uma única variável (provavelmente dentro de um procedimento armazenado).
Sintaxe do Transact-SQL¶
Sintaxe do Snowflake¶
O Snowflake permite 3 linguagens diferentes em suas funções definidas pelo usuário:
SQL
JavaScript
Java
Por enquanto, o SnowConvert AI será compatível somente com SQL e JavaScript como linguagens de destino.
SQL¶
Nota
Funções definidas pelo usuário do SQL suportam apenas uma consulta como seu corpo. Elas podem ler o banco de dados, mas não têm permissão para gravá-lo ou modificá-lo. (Referência Scalar SQL UDFs).
JavaScript¶
Nota
Funções definidas pelo usuário do JavaScript permitem várias instruções em seus corpos, mas não podem realizar consultas ao banco de dados. (Referência Scalar JavaScriptUDFs)
Amostra de padrões da origem¶
Instruções Set e Declare¶
As instruções mais comuns nos corpos das funções são as instruções DECLARE e SET. Para instruções DECLARE sem valor padrão, a transformação será ignorada. As instruções SET e DECLARE com um valor padrão serão transformadas em COMMON TABLE EXPRESSION. Cada expressão de tabela comum conterá uma coluna que representa o valor da variável local.
Transact-SQL¶
Consulta¶
Resultado¶
vendor_name |
|---|
Australia Bike Retailer |
Snowflake¶
Consulta¶
Resultado¶
VENDOR_NAME |
|---|
Australia Bike Retailer |
Transformação da instrução If/Else¶
As instruções If/Else podem ser tratadas de diferentes maneiras: elas podem ser transformadas em Javascript ou em SQL usando CASE EXPRESSION dentro de Select permitindo condicionais dentro de consultas, enquanto a transformação em Javascript é bastante simples, a instrução Case pode não ser tão óbvia à primeira vista.
Transact-SQL¶
Consulta¶
Resultado¶
has_active_flag |
|---|
NO |
Snowflake¶
Consulta¶
Resultado¶
HAS_ACTIVE_FLAG |
|---|
NO |
Instruções aninhadas¶
For nested statements, the structured programming is being transformed to a single query. The statements in the control-of-flow are going to be nested in table structures to preserve the execution order.
Nota
CASE EXPRESSIONS só pode retornar um valor por instrução
Exemplo¶
Nota
O código a seguir em ambos os paradigmas de programação é funcionalmente equivalente.
Programação estruturada¶
SQL¶
Resultado¶
AccountNumber |
|---|
LITWARE0001 |
Variáveis condicionais por meio de SELECTs¶
A definição e a atribuição de variáveis em instruções condicionais tendem a ser um pouco problemáticas, pois as referências à variável mais adiante no código precisariam saber onde a variável foi modificada pela última vez. Além disso, se a referência estiver dentro de outra instrução condicional, terá de haver algum tipo de redirecionamento que faça referência à atribuição conhecida anterior à variável.
Isso tudo é agravado pelo aninhamento e por consultas complexas presentes no código de entrada. É por isso que um EWI específico é adicionado quando esses padrões são encontrados.
No cenário a seguir, a primeira instrução IF pode ser transformada sem problemas, pois o conteúdo é bastante simples. A segunda e a terceira instruções IF estão comentadas porque não são compatíveis no momento, já que há instruções que não são atribuições de variáveis por meio de SELECT.
SQL Server¶
Consulta¶
Resultado¶
RESULT |
|---|
10 |
Snowflake¶
Consulta¶
Resultado¶
RESULT |
|---|
10 |
Atribuir e retornar uma variável¶
In this simple pattern, there is a variable declaration, then, that variable is set using a SELECT statement and finally returned. This is going to be migrated to a Common Table Expression to keep the original behavior.
SQL Server¶
Consulta¶
Resultado¶
Resultado |
|---|
1583978.2263 |
Snowflake¶
Consulta¶
Resultado¶
RESULT |
|---|
1583978.2263 |
Chamadas de funções múltiplas¶
Para esse padrão específico, não há consultas óbvias, mas há várias chamadas para várias funções que trabalham com a mesma variável e a retornam no final. Como o Snowflake só oferece suporte a consultas dentro de suas funções, a solução para esse bloco será adicioná-lo a um Select e aninhar as chamadas dentro dele, certificando-se de que o valor de retorno seja o mesmo que o da origem.
SQL Server¶
Consulta¶
Resultado¶
Nome |
|---|
USA Car Retailer |
Snowflake¶
Consulta¶
Resultado¶
NAME |
|---|
USA Car Retailer |
Aumentar uma variável com base em várias condições IF e retornar seu valor¶
Para esse padrão, uma variável é modificada (aumentada, neste caso) usando várias condições IF. No início, um conjunto de variáveis é inicializado e usado para determinar se a variável de resultado deve ser aumentada ou não. Por fim, a variável de resultado é retornada.
SQL Server¶
Consulta¶
Resultado¶
Resultado |
|---|
473.1415 |
Snowflake¶
Consulta¶
Resultado¶
RESULT |
|---|
473.1415 |
Duas ou mais instruções RETURN¶
Para esse padrão, o bloco IF que contém a cláusula de retorno que interrompe o fluxo do código é adicionado ao final do corpo, como a instrução final a ser executada em uma expressão CASE.
Case básico¶
Para esse cenário específico, não há lógica entre a instrução condicional RETURN e a instrução final RETURN, portanto, todo o corpo será mapeado para um único CASE EXPRESSION.
SQL Server¶
Consulta¶
Resultado¶
resultado |
|---|
1 |
Snowflake¶
Consulta¶
Resultado¶
RESULT |
|---|
1 |
Expressões de tabela comuns¶
Common table expressions will be kept as in the original code, and they are going to be concatenated with the generated ones. SnowConvert AI is able to identify first all the original COMMON TABLE EXPRESSION names to avoid generating duplicated names.
SQL Server¶
Consulta¶
Resultado¶
resultado |
|---|
3689 |
Snowflake¶
Consulta¶
Resultado¶
RESULT |
|---|
3689 |
Transformar em JavaScript UDFs¶
Se houver várias instruções e a função não acessar o banco de dados de forma alguma, ela poderá ser transformada em uma função JavaScript mantendo a equivalência funcional
SQL Server¶
Consulta 1¶
Consulta 2¶
Resultado 1¶
DATE |
|---|
2021 |
Resultado 2¶
CleanChargeCode |
|---|
16 |
Snowflake¶
Consulta 1¶
Consulta 2¶
Resultado 1¶
DATE |
|---|
2021.0 |
Resultado 2¶
CLEANCHARGECODE |
|---|
16 |
Problemas conhecidos¶
Aviso
As funções definidas pelo usuário não podem ser usadas para executar ações que modifiquem o estado do banco de dados
Aviso
As funções definidas pelo usuário não podem conter uma cláusula OUTPUT INTO que tenha uma tabela como destino
Aviso
As funções definidas pelo usuário não podem DECLARE, OPEN, FETCH, CLOSE ou DEALLOCATE um CURSOR. Use um procedimento armazenado se você precisar usar cursores.
Aviso
As funções definidas pelo usuário não podem executar instruções de controle de fluxo, como WHILE, se houver pelo menos uma chamada ao banco de dados
Aviso
As funções definidas pelo usuário com referências a outras funções definidas pelo usuário que foram transformadas em procedimentos armazenados também serão transformadas em procedimentos armazenados.
Aviso
User-defined functions that use @@ROWCOUNT are not supported in SQL and should be transformed to stored procedures to keep the functional equivalence.
Aviso
As funções definidas pelo usuário que têm instruções SELECT atribuindo uma variável a si mesmas não são compatíveis com o Snowflake. Consulte também SELECT @local_variable
Para todos os casos sem suporte, consulte o EWIs relacionado e os padrões abaixo para obter recomendações e possíveis soluções alternativas.
Condicionais que não sejam instruções if/else ao lado de consultas¶
O próximo cenário envolve o uso da instrução «while» junto com outras consultas. O problema com esse exemplo é que não há como transformar a instrução while em CTE dentro da cláusula WITH de Select principal, o que nos força a transformar essa instrução em um procedimento JavaScript para manter a mesma lógica.
SQL Server¶
Consulta¶
Resultado¶
resultado |
|---|
1007 |
Snowflake
Consulta¶
Resultado¶
FOO |
|---|
1007 |
Atribuir uma variável usando seu próprio valor ao iterar por um conjunto de linhas¶
In the following example, the variable @names is used to concatenate multiple values from a column into one single string. The variable is updated on each iteration as shown, which is not supported by Snowflake UDFs. For this scenario, the function should be transformed into a procedure.
SQL Server
Consulta¶
Resultado¶
nomes |
|---|
Australia Bike Retailer Allenson Cycles Advanced Bicycles Trikes, Inc. Morgan Bike Accessories Cycling Master Chicago Rent-All Greenwood Athletic Company Compete Enterprises, Inc International Light Speed Training Systems Gardner Touring Cycles Internati |
Consulta do Snowflake
Aviso
Para os cenários descritos acima, considere as seguintes limitações:
Todas as chamadas para funções definidas pelo usuário nas consultas DML, como
SELECT,INSERT,DELETE,UPDATEouMERGE, falharão porque não são permitidas chamadas para procedimentos armazenados nessas consultas.As chamadas para funções definidas pelo usuário dentro de procedimentos devem ser precedidas pela palavra-chave
CALL.User-defined functions used in COMPUTED COLUMNS will fail during the execution.
EWIs relacionados¶
SSC-EWI-0067: UDF foi transformado em um procedimento Snowflake, não há suporte para a chamada de procedimentos dentro de uma consulta.
SSC-EWI-0068: a função definida pelo usuário foi transformada em um procedimento Snowflake.
SSC-EWI-0073: Revisão de equivalência funcional pendente.
UDF do Script Snowflake (SCALAR)¶
Referência de tradução de funções definidas pelo usuário escalares do SQL Server para UDFs do Script Snowflake
Applies to
SQL Server
Azure Synapse Analytics
Descrição¶
O SnowConvert é compatível com a tradução de funções definidas pelo usuário escalares do SQL Server diretamente para UDFs do Script Snowflake (UDFs do SnowScript) quando atenderem a critérios específicos, em vez de converter todas as funções em procedimentos armazenados.
UDFs do Script Snowflake são funções definidas pelo usuário escritas usando a sintaxe da linguagem de procedimento do Snowflake (Snowscript) dentro do corpo de uma UDF SQL. Elas aceitam variáveis, loops, lógica condicional e tratamento de exceções.
Quando as funções se tornam UDFs do SnowScript¶
O SnowConvert analisa cada função do SQL Server e determina automaticamente o destino apropriado do Snowflake. Uma função se torna uma UDF do SnowScript quando contém apenas lógica de procedimento sem operações de acesso a dados.
Amostra de padrões da origem¶
Função de cálculo simples¶
Uma função escalar básica que realiza cálculos sem consultar dados.
SQL Server¶
Resultado¶
Lucro |
|---|
50,00 |
Snowflake (UDF do SnowScript)¶
Resultado¶
PROFIT |
|---|
50,00 |
Função com lógica condicional (IF/ELSE)¶
Funções usadas por instruções IF/ELSE para lógica de negócios.
SQL Server¶
Resultado¶
DiscountRate |
|---|
0.20 |
Snowflake (UDF do SnowScript)¶
Resultado¶
DISCOUNTRATE |
|---|
0.20 |
Função com loop WHILE¶
Funções usadas por loops WHILE para cálculos iterativos.
SQL Server¶
Resultado¶
FactorialResult |
|---|
120 |
Snowflake (UDF do SnowScript)¶
Resultado¶
FACTORIALRESULT |
|---|
120 |
Função de manipulação de cadeia de caracteres¶
Operações complexas de cadeia de caracteres usando loops e lógica condicional.
SQL Server¶
Resultado¶
CleanPhone |
|---|
5551234567 |
Snowflake (UDF do SnowScript)¶
Resultado¶
CLEANPHONE |
|---|
5551234567 |
Lógica da instrução CASE¶
Funções usando expressões CASE para categorização.
SQL Server¶
Resultado¶
Nota |
|---|
B |
Snowflake (UDF do SnowScript)¶
Resultado¶
GRADE |
|---|
B |
Select Into variable assignment¶
Functions using simple select into for variable assignment.
SQL Server¶
Resultado¶
CALCULATEPRICE(100, 3) |
|---|
285 |
Snowflake (UDF do SnowScript)¶
Resultado¶
CALCULATEPRICE(100, 3) |
|---|
285 |
Problemas conhecidos¶
Aviso
SnowConvert AI will not translate UDFs containing the following elements into SnowScripting UDFs, as these features are unsupported in SnowScripting UDFs:
acessar tabelas de banco de dados
usar cursores
chamar outras UDFs
conter funções agregadas ou de janela
realizar operações DML (INSERT/UPDATE/DELETE)
retornar conjuntos de resultados
EWIs relacionados¶
SSC-EWI-0067: UDF foi transformado em um procedimento Snowflake, não há suporte para a chamada de procedimentos dentro de uma consulta.
SSC-EWI-0068: a função definida pelo usuário foi transformada em um procedimento Snowflake.
SSC-EWI-0073: Revisão de equivalência funcional pendente.