SnowConvert AI – Diferenças funcionais do SQL Server-Azure Synapse¶
Applies to
SQL Server
Azure Synapse Analytics
SSC-FDM-TS0001¶
Nota
Esta FDM está obsoleta. Consulte a documentação SSC-EWI-TS0077.
Descrição¶
Esta mensagem é exibida quando há uma cláusula de agrupamento que não é compatível com o Snowflake.
Exemplo de código¶
Código de entrada:¶
SELECT 'a' COLLATE Albanian_BIN;
SELECT 'a' COLLATE Albanian_CI_AI;
CREATE TABLE ExampleTable (
ID INT,
Name VARCHAR(50) COLLATE collateName
);
Código gerado:¶
SELECT 'a'
-- --** SSC-FDM-TS0001 - COLLATION Albanian_BIN NOT SUPPORTED **
-- COLLATE Albanian_BIN
;
SELECT 'a'
-- --** SSC-FDM-TS0001 - COLLATION Albanian_CI_AI NOT SUPPORTED **
-- COLLATE Albanian_CI_AI
;
CREATE OR REPLACE TABLE ExampleTable (
ID INT,
Name VARCHAR(50)
-- --** SSC-FDM-TS0001 - COLLATION collateName NOT SUPPORTED **
-- COLLATE collateName
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
;
Práticas recomendadas¶
Nenhuma ação adicional é necessária por parte do usuário.
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-FDM-TS0002¶
Descrição¶
Esta mensagem é exibida quando há uma cláusula de agrupamento que não é compatível com o Snowflake.
Exemplo de código¶
Código de entrada:¶
SELECT 'a' COLLATE Latin1_General_CI_AS_WS;
Código gerado:¶
SELECT 'a' COLLATE 'EN-CI-AS' /*** SSC-FDM-TS0002 - COLLATION FOR VALUE WS NOT SUPPORTED ***/;
Práticas recomendadas¶
Nenhuma ação adicional é necessária por parte do usuário.
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-FDM-TS0003¶
XP_LOGININFO mapeado para UDF personalizado
Descrição¶
Esta mensagem é exibida quando o procedimento XP_LOGININFO é executado e retorna o seguinte conjunto de colunas (Consulte a documentação do SQL SERVER para obter mais informações)
| account name | type | privilege | mapped login name | permission path |
Para replicar esse comportamento, existe uma consulta que seleciona as colunas da exibição APPLICABLE_ROLES no Snowflake, que retorna o seguinte conjunto de colunas (Consulte a documentação do SnowFlake para obter mais informações)
GRANTEE |
ROLE_NAME |
ROLE_OWNER |
IS_GRANTABLE |
|---|
As colunas originais do SQL Server são mapeadas conforme mostrado na próxima tabela. Eles podem não ser completamente equivalentes.
| SQL Server | SnowFlake | |
|---|---|---|
| account name | GRANTEE | |
| type | ROLE_OWNER | |
| privilege | ROLE_NAME | |
| mapped login name | GRANTEE | |
| permission path | NULL |
Exemplo de código¶
Código de entrada:¶
EXEC xp_logininfo
EXEC xp_logininfo 'USERNAME'
Código gerado:¶
--** SSC-FDM-TS0003 - XP_LOGININFO MAPPED TO CUSTOM UDF XP_LOGININFO_UDF AND MIGHT HAVE DIFFERENT BEHAVIOR **
SELECT
*
FROM
TABLE(XP_LOGININFO_UDF());
--** SSC-FDM-TS0003 - XP_LOGININFO MAPPED TO CUSTOM UDF XP_LOGININFO_UDF AND MIGHT HAVE DIFFERENT BEHAVIOR **
SELECT
*
FROM
TABLE(XP_LOGININFO_UDF('USERNAME'));
Práticas recomendadas¶
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-FDM-TS0004¶
Descrição¶
Esta mensagem é exibida quando um BULK INSERT foi transformado e um comando PUT é adicionado ao código de saída. Isso acontece porque o comando PUT não pode ser executado usando a UI da Web do SnowSQL. Para executá-lo com sucesso, qualquer usuário deve ter o SnowCLI instalado previamente.
Exemplo de código¶
Código de entrada:¶
BULK INSERT #temptable FROM 'path/to/file.txt'
WITH
(
FIELDTERMINATOR ='\t',
ROWTERMINATOR ='\n'
);
Código gerado:¶
CREATE OR REPLACE FILE FORMAT FILE_FORMAT_638466175888203490
FIELD_DELIMITER = '\t'
RECORD_DELIMITER = '\n';
CREATE OR REPLACE STAGE STAGE_638466175888203490
FILE_FORMAT = FILE_FORMAT_638466175888203490;
--** SSC-FDM-TS0004 - PUT STATEMENT IS NOT SUPPORTED ON WEB UI. YOU SHOULD EXECUTE THE CODE THROUGH THE SNOWFLAKE CLI **
PUT file://path/to/file.txt @STAGE_638466175888203490 AUTO_COMPRESS = FALSE;
--** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "#temptable" **
COPY INTO T_temptable FROM @STAGE_638466175888203490/file.txt;
Práticas recomendadas¶
Instale SnowCLI.
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-FDM-TS0005¶
Não é possível converterTRY_CONVERT/TRY_CAST para TRY_CAST
Descrição¶
Esta FMD é adicionada quando não é possível converter um TRY_CONVERT ou TRY_CAST para um TRY_CAST no Snowflake.
A função TRY_CAST do Snowflake tem uma limitação, pois permite apenas a conversão de expressões de cadeia de caracteres. No entanto, as funções TRY_CONVERT e TRY_CAST do Transact permitem qualquer expressão de tipo de dados.
Atualmente, a transformação de TRY_CONVERT ou TRY_CAST para TRY_CAST do Snowflake só é realizada para expressões de cadeia de caracteres ou expressões que a ferramenta possa identificar como cadeias de caracteres no contexto.
Exemplo de código¶
Código de entrada:¶
SELECT TRY_CAST(14.85 AS INT);
SELECT TRY_CONVERT(VARCHAR, 1234);
SELECT TRY_CONVERT(CHAR, 1);
SELECT TRY_CONVERT(SQL_VARIANT, '2017-01-01 12:00:00');
SELECT TRY_CONVERT(GEOGRAPHY, 'LINESTRING(-122.360 47.656, -122.343 47.656 )');
Código gerado:¶
SELECT
CAST(14.85 AS INT) /*** SSC-FDM-TS0005 - TRY_CONVERT/TRY_CAST COULD NOT BE CONVERTED TO TRY_CAST ***/;
SELECT
TO_VARCHAR(1234);
SELECT
TO_CHAR(1);
SELECT
TO_VARIANT('2017-01-01 12:00:00');
SELECT
TO_GEOGRAPHY('LINESTRING(-122.360 47.656, -122.343 47.656 )');
Práticas recomendadas¶
Nenhuma ação adicional é necessária por parte do usuário.
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-FDM-TS0006¶
A cláusula EXECUTEAS «user_name» não existe no Snowflake e o usuário que chama o procedimento deve ter todos os privilégios necessários.
Descrição¶
Esta mensagem é exibida quando o SnowConvertAI encontra um procedimento com uma cláusula EXECUTE AS “user_name”. Isso não é compatível com o Snowflake; portanto, foi alterado para EXECUTE AS CALLER.
Esta cláusula especifica o contexto de segurança sob o qual o procedimento deve ser executado.
Nota
Para obter mais detalhes, consulte a documentação sobre a funcionalidade da cláusula.
Exemplo de código¶
Código de entrada:¶
CREATE PROCEDURE SelectAllCustomers
WITH EXECUTE AS 'user_name'
AS
BEGIN
SELECT * FROM Customers;
END;
Código gerado:¶
--** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "Customers" **
CREATE OR REPLACE PROCEDURE SelectAllCustomers ()
RETURNS TABLE()
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
EXECUTE AS CALLER
--** SSC-FDM-TS0006 - EXECUTE AS 'user_name' CLAUSE DOES NOT EXIST IN SNOWFLAKE AND THE USER CALLING THE PROCEDURE SHOULD HAVE ALL THE REQUIRED PRIVILEGES **
AS
$$
DECLARE
ProcedureResultSet RESULTSET;
BEGIN
ProcedureResultSet := (
SELECT
*
FROM
Customers);
RETURN TABLE(ProcedureResultSet);
END;
$$;
Práticas recomendadas¶
Nenhuma ação adicional é necessária por parte do usuário.
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-FDM-TS0007¶
A cláusula FOR REPLICATION não existe no Snowflake.
Descrição¶
Esta mensagem é exibida quando o SnowConvert AI encontra um procedimento com uma cláusula FOR REPLICATION. Isso não é compatível com o Snowflake, portanto, foi removido.
Esta cláusula especifica que o procedimento foi criado para replicação. Consequentemente, ele não pode ser executado no Assinante.
Nota
Para obter mais detalhes, consulte a documentação sobre a funcionalidade da cláusula.
Exemplo de código¶
Código de entrada:¶
CREATE PROCEDURE SelectAllCustomers
WITH FOR REPLICATION
AS
BEGIN
SELECT * FROM Customers;
END;
Código gerado:¶
--** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "Customers" **
CREATE OR REPLACE PROCEDURE SelectAllCustomers ()
RETURNS TABLE()
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
EXECUTE AS CALLER
--** SSC-FDM-TS0007 - FOR REPLICATION CLAUSE DOES NOT EXIST IN SNOWFLAKE **
AS
$$
DECLARE
ProcedureResultSet RESULTSET;
BEGIN
ProcedureResultSet := (
SELECT
*
FROM
Customers);
RETURN TABLE(ProcedureResultSet);
END;
$$;
Práticas recomendadas¶
Nenhuma ação adicional é necessária por parte do usuário.
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-FDM-TS0008¶
A função FORMATMESSAGE foi convertida para UDF
Descrição¶
Este aviso foi adicionado porque a função FORMATMESSAGE estava sendo utilizada e foi substituída por FORMATMESSAGE_UDF. O motivo para adicionar o aviso é que a função FORMATMESSAGE_UDF utilizada para substituir a FORMATMESSAGE não lida corretamente com todos os tipos de formatos e pode gerar um erro em determinadas condições.
Valores numéricos não assinados que são fornecidos como negativos preservarão o sinal em vez de converter o valor. Além disso, o espaço reservado %I64d não é compatível com a função UDF; portanto, gerará um erro quando utilizado.
Na função FORMATMESSAGE_UDF, ocorrerá um erro se o número de argumentos fornecidos for diferente do número de espaços reservados.
Este UDF não é compatível com o uso de IDs de números de mensagem.
Exemplo de código¶
Código de entrada:¶
SELECT FORMATMESSAGE('Unsigned int %u, %u', 50, -50); -- Unsigned int 50, 4294967246
SELECT FORMATMESSAGE('Unsigned octal %o, %o', 50, -50); -- Unsigned octal 62, 37777777716
SELECT FORMATMESSAGE('Unsigned hexadecimal %X, %x', -11, -50); -- Unsigned hexadecimal FFFFFFF5, ffffffce
SELECT FORMATMESSAGE('Unsigned octal with prefix: %#o', -50); -- Unsigned octal with prefix: 037777777716
SELECT FORMATMESSAGE('Unsigned hexadecimal with prefix: %#X, %x', -11,-50); -- Unsigned hexadecimal with prefix: 0XFFFFFFF5, ffffffce
SELECT FORMATMESSAGE('Bigint %I64d', 3000000000); -- Bigint 3000000000
SELECT FORMATMESSAGE('My message: %s %s %s', 'Hello', 'World'); -- My message: Hello World (null)
Código gerado:¶
SELECT
--** SSC-FDM-TS0008 - FORMATMESSAGE WAS CONVERTED TO CUSTOM UDF FORMATMESSAGE_UDF AND IT MIGHT HAVE A DIFFERENT BEHAVIOR. **
FORMATMESSAGE_UDF('Unsigned int %u, %u', ARRAY_CONSTRUCT(50, -50)); -- Unsigned int 50, 4294967246
SELECT
--** SSC-FDM-TS0008 - FORMATMESSAGE WAS CONVERTED TO CUSTOM UDF FORMATMESSAGE_UDF AND IT MIGHT HAVE A DIFFERENT BEHAVIOR. **
FORMATMESSAGE_UDF('Unsigned octal %o, %o', ARRAY_CONSTRUCT(50, -50)); -- Unsigned octal 62, 37777777716
SELECT
--** SSC-FDM-TS0008 - FORMATMESSAGE WAS CONVERTED TO CUSTOM UDF FORMATMESSAGE_UDF AND IT MIGHT HAVE A DIFFERENT BEHAVIOR. **
FORMATMESSAGE_UDF('Unsigned hexadecimal %X, %x', ARRAY_CONSTRUCT(-11, -50)); -- Unsigned hexadecimal FFFFFFF5, ffffffce
SELECT
--** SSC-FDM-TS0008 - FORMATMESSAGE WAS CONVERTED TO CUSTOM UDF FORMATMESSAGE_UDF AND IT MIGHT HAVE A DIFFERENT BEHAVIOR. **
FORMATMESSAGE_UDF('Unsigned octal with prefix: %#o', ARRAY_CONSTRUCT(-50)); -- Unsigned octal with prefix: 037777777716
SELECT
--** SSC-FDM-TS0008 - FORMATMESSAGE WAS CONVERTED TO CUSTOM UDF FORMATMESSAGE_UDF AND IT MIGHT HAVE A DIFFERENT BEHAVIOR. **
FORMATMESSAGE_UDF('Unsigned hexadecimal with prefix: %#X, %x', ARRAY_CONSTRUCT(-11, -50)); -- Unsigned hexadecimal with prefix: 0XFFFFFFF5, ffffffce
SELECT
--** SSC-FDM-TS0008 - FORMATMESSAGE WAS CONVERTED TO CUSTOM UDF FORMATMESSAGE_UDF AND IT MIGHT HAVE A DIFFERENT BEHAVIOR. **
FORMATMESSAGE_UDF('Bigint %I64d', ARRAY_CONSTRUCT(3000000000)); -- Bigint 3000000000
SELECT
--** SSC-FDM-TS0008 - FORMATMESSAGE WAS CONVERTED TO CUSTOM UDF FORMATMESSAGE_UDF AND IT MIGHT HAVE A DIFFERENT BEHAVIOR. **
FORMATMESSAGE_UDF('My message: %s %s %s', ARRAY_CONSTRUCT('Hello', 'World')); -- My message: Hello World (null)
Práticas recomendadas¶
Evite usar o espaço reservado
%I64dna mensagem.Use a mensagem diretamente como uma cadeia de caracteres em vez de usar um ID de mensagem como primeiro argumento.
Certifique-se de que o número de espaços reservados seja o mesmo que o número de argumentos após a mensagem.
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-FDM-TS0009¶
Encrypted with não compatível no Snowflake.
Descrição¶
Este aviso é adicionado quando há uma ENCRYPTED WITH utilizada em uma definição de coluna. Como isso não é compatível com o Snowflake, está sendo removida e um aviso é adicionado.
Exemplo de código¶
Código de entrada:¶
CREATE TABLE [SCHEMA1].[TABLE1] (
[COL1] NVARCHAR(60)
ENCRYPTED WITH (
COLUMN_ENCRYPTION_KEY = MyCEK,
ENCRYPTION_TYPE = RANDOMIZED,
ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256'
)
);
Código gerado:¶
CREATE OR REPLACE TABLE SCHEMA1.TABLE1 (
COL1 VARCHAR(60)
-- --** SSC-FDM-TS0009 - ENCRYPTED WITH NOT SUPPORTED IN SNOWFLAKE **
-- ENCRYPTED WITH (
-- COLUMN_ENCRYPTION_KEY = MyCEK,
-- ENCRYPTION_TYPE = RANDOMIZED,
-- ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256'
-- )
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"transact"}}'
;
Práticas recomendadas¶
Nenhuma ação adicional é necessária por parte do usuário.
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-FDM-TS0010¶
A função CURRENT_DATABASE tem comportamento diferente em certos casos.
Descrição¶
Este EWI é adicionado quando a função DB_NAME é transformada em CURRENT_DATABASE porque o Snowflake não é compatível com o parâmetro database_id e a função CURRENT_DATABASE sempre retornará o nome do banco de dados atual.
Exemplo de código¶
Código de entrada:¶
SELECT DB_NAME(someId);
Código gerado:¶
SELECT
CURRENT_DATABASE() /*** SSC-FDM-TS0010 - CURRENT_DATABASE function has different behavior in certain cases ***/;
Práticas recomendadas¶
Nenhuma ação adicional é necessária por parte do usuário.
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-FDM-TS0011¶
Valor padrão não permitido no Snowflake.
Nota
Esta FDM está obsoleta. Consulte a documentação SSC-EWI-TS0078.
Descrição¶
Esse erro é adicionado ao código quando expressões como chamadas de função, nomes de variáveis ou constantes nomeadas seguem a opção padrão.
O Snowflake só é compatível com constantes explícitas, como números ou cadeias de caracteres.
Exemplo de código¶
Código de entrada:¶
ALTER TABLE
T_ALTERTABLETEST
ADD
COLUMN COL10 INTEGER DEFAULT RANDOM(10);
Código gerado:¶
--** SSC-FDM-0007 - MISSING DEPENDENT OBJECTS "T_ALTERTABLETEST", "RANDOM" **
ALTER TABLE IF EXISTS T_ALTERTABLETEST
ADD
COLUMN COL10 INTEGER
-- --** SSC-FDM-TS0011 - DEFAULT OPTION NOT ALLOWED IN SNOWFLAKE **
-- DEFAULT RANDOM(10)
;
¶
Práticas recomendadas¶
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-FDM-TS0012¶
Não foram encontradas informações para a coluna. STRING utilizado para corresponder à operação CAST
Descrição¶
Este EWI é adicionado em funções definidas pelo usuário com valores de tabela, em que o tipo de retorno de uma coluna não pode ser determinado durante a conversão. STRING é utilizado como padrão para corresponder à operação CAST na instrução SELECT <!–TODO: search for a broken reference.->
Exemplo de código¶
Código de entrada:¶
CREATE FUNCTION GetDepartmentInfo()
RETURNS TABLE
AS
RETURN
(
SELECT DepartmentID, Name, GroupName
FROM HumanResources.Department
);
Código gerado:¶
CREATE OR REPLACE FUNCTION GetDepartmentInfo ()
RETURNS TABLE(
DepartmentID STRING /*** SSC-FDM-TS0012 - INFORMATION FOR THE COLUMN DepartmentID WAS NOT FOUND. STRING DATATYPE USED TO MATCH CAST AS STRING OPERATION ***/,
Name STRING /*** SSC-FDM-TS0012 - INFORMATION FOR THE COLUMN Name WAS NOT FOUND. STRING DATATYPE USED TO MATCH CAST AS STRING OPERATION ***/,
GroupName STRING /*** SSC-FDM-TS0012 - INFORMATION FOR THE COLUMN GroupName WAS NOT FOUND. STRING DATATYPE USED TO MATCH CAST AS STRING OPERATION ***/
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
AS
$$
SELECT
CAST(DepartmentID AS STRING),
CAST(Name AS STRING),
CAST(GroupName AS STRING)
FROM
HumanResources.Department
$$;
Práticas recomendadas¶
O usuário deve verificar qual é o tipo de dados correto que não foi possível encontrar e alterá-lo na definição da instrução
RETURNS TABLE.Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-FDM-TS0013¶
As linhas do cursor do Snowflake Scripting não são modificáveis.
Descrição¶
Este EWI é adicionado quando os cursores estão abertos para modificação no código de entrada. O Snowflake Scripting não permite modificar linhas de cursor.
Exemplo de código:¶
Código de entrada:¶
CREATE OR ALTER PROCEDURE modifiablecursorTest
AS
BEGIN
-- Should be marked with SSC-FDM-TS0013
DECLARE CursorVar CURSOR
FOR
SELECT FirstName
FROM vEmployee;
DECLARE CursorVar2 INSENSITIVE CURSOR
FOR
SELECT FirstName
FROM vEmployee;
DECLARE CursorVar3 CURSOR KEYSET SCROLL_LOCKS
FOR
SELECT FirstName
FROM vEmployee;
DECLARE CursorVar4 CURSOR DYNAMIC OPTIMISTIC
FOR
SELECT FirstName
FROM vEmployee;
DECLARE CursorVar6 CURSOR STATIC
FOR
SELECT FirstName
FROM vEmployee;
DECLARE CursorVar7 CURSOR READ_ONLY
FOR
SELECT FirstName
FROM vEmployee;
-- Shouid not be marked
DECLARE CursorVar5 CURSOR STATIC READ_ONLY
FOR
SELECT FirstName
FROM vEmployee;
RETURN 'DONE';
END;
Código gerado:¶
CREATE OR REPLACE PROCEDURE modifiablecursorTest ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
EXECUTE AS CALLER
AS
$$
DECLARE
-- Should be marked with SSC-FDM-TS0013
--** SSC-FDM-TS0013 - SNOWFLAKE SCRIPTING CURSOR ROWS ARE NOT MODIFIABLE **
CursorVar CURSOR
FOR
SELECT
FirstName
FROM
vEmployee;
--** SSC-FDM-TS0013 - SNOWFLAKE SCRIPTING CURSOR ROWS ARE NOT MODIFIABLE **
CursorVar2 CURSOR
FOR
SELECT
FirstName
FROM
vEmployee;
--** SSC-FDM-TS0013 - SNOWFLAKE SCRIPTING CURSOR ROWS ARE NOT MODIFIABLE **
CursorVar3 CURSOR
FOR
SELECT
FirstName
FROM
vEmployee;
--** SSC-FDM-TS0013 - SNOWFLAKE SCRIPTING CURSOR ROWS ARE NOT MODIFIABLE **
CursorVar4 CURSOR
FOR
SELECT
FirstName
FROM
vEmployee;
--** SSC-FDM-TS0013 - SNOWFLAKE SCRIPTING CURSOR ROWS ARE NOT MODIFIABLE **
CursorVar6 CURSOR
FOR
SELECT
FirstName
FROM
vEmployee;
--** SSC-FDM-TS0013 - SNOWFLAKE SCRIPTING CURSOR ROWS ARE NOT MODIFIABLE **
CursorVar7 CURSOR
FOR
SELECT
FirstName
FROM
vEmployee;
-- Shouid not be marked
CursorVar5 CURSOR
FOR
SELECT
FirstName
FROM
vEmployee;
BEGIN
RETURN 'DONE';
END;
$$;
Práticas recomendadas¶
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-FDM-TS0014¶
Coluna computada transformada
Descrição¶
Este aviso é adicionado quando uma coluna computada do SQL Server é transformada em seu equivalente do Snowflake. É adicionado porque, em alguns casos, a equivalência funcional pode ser afetada.
Exemplo de código¶
Código de entrada:¶
CREATE TABLE [TestTable](
[Col1] AS (CONVERT ([REAL], ExpressionValue))
);
Código gerado:¶
CREATE OR REPLACE TABLE TestTable (
Col1 REAL AS (CAST(ExpressionValue AS REAL)) /*** SSC-FDM-TS0014 - COMPUTED COLUMN WAS TRANSFORMED TO ITS SNOWFLAKE EQUIVALENT, FUNCTIONAL EQUIVALENCE VERIFICATION PENDING. ***/
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
;
Práticas recomendadas¶
Nenhuma ação adicional do usuário é necessária; ele é apenas informativo.
Adicione alterações manuais à expressão não transformada.
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-FDM-TS0016¶
As colunas XML no Snowflake podem ter um formato diferente
Descrição¶
Este aviso é adicionado quando uma cláusula FOR XML do SQL Server é transformada em seu equivalente no Snowflake. Ele é adicionado porque as colunas em XML podem ser diferentes.
Exemplo de código¶
Considere o seguinte exemplo de tabela chamada employee.
Id |
Nome |
Dica |
|---|---|---|
1 |
Kinslee Park |
Desenvolvedor |
2 |
Ezra Mata |
Desenvolvedor |
3 |
Aliana Quinn |
Gerente |
Código de entrada:¶
Código¶
SELECT
e.id,
e.name as full_name,
e.hint
FROM
employee e
FOR XML PATH;
Saída¶
<row>
<id>1</id>
<full_name>Kinslee Park</full_name>
<hint>Developer</hint>
</row>
<row>
<id>2</id>
<full_name>Ezra Mata</full_name>
<hint>Developer</hint>
</row>
<row>
<id>3</id>
<full_name>Aliana Quinn</full_name>
<hint>Manager</hint>
</row>
Código gerado:¶
Código¶
SELECT
--** SSC-FDM-TS0016 - XML COLUMNS IN SNOWFLAKE MIGHT HAVE A DIFFERENT FORMAT **
FOR_XML_UDF(OBJECT_CONSTRUCT('id', e.id, 'full_name', e.name, 'hint', e.hint), 'row')
FROM
employee e;
Saída¶
<row type="OBJECT">
<full_name type="VARCHAR">Kinslee Park</full_name>
<hint type="VARCHAR">Developer</hint>
<id type="INTEGER">1</id>
</row>
<row type="OBJECT">
<full_name type="VARCHAR">Ezra Mata</full_name>
<hint type="VARCHAR">Developer</hint>
<id type="INTEGER">2</id>
</row>
<row type="OBJECT">
<full_name type="VARCHAR">Aliana Quinn</full_name>
<hint type="VARCHAR">Manager</hint>
<id type="INTEGER">3</id>
</row>
Práticas recomendadas¶
Nenhuma ação adicional do usuário é necessária; ele é apenas informativo.
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-FDM-TS0017¶
A função CURRENT_USER não é compatível com um ID de usuário como parâmetro.
Descrição¶
Este EWI quando funções como SUSER_NAME ou SUSER_SNAME contêm o identificador do usuário como parâmetro, pois este último não é compatível com a função CURRENT_USER do Snowflake.
Código de entrada:¶
SELECT SUSER_NAME(0x010500000000000515000000a065cf7e784b9b5fe77c87705a2e0000);
Código gerado:¶
SELECT
CURRENT_USER() /*** SSC-FDM-TS0017 - User ID parameter used in SUSER_NAME function is not supported in CURRENT_USER function and it was removed. ***/;
Práticas recomendadas¶
Nenhuma ação adicional é necessária por parte do usuário.
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-FDM-TS0018¶
O comando do console do banco de dados não é compatível.
Nota
Esta FDM está obsoleta. Consulte a documentação SSC-EWI-TS0079.
Descrição¶
Esta FMD é adicionada quando o SnowConvert AI encontra uma instrução DBCC no código de entrada.\ A maioria das instruções DBCC não é compatível com o Snowflake.
Exemplo de código¶
Código de entrada:¶
DBCC CHECKIDENT(@a, RESEED, @b) WITH NO_INFOMSGS
Código gerado:¶
----** SSC-FDM-TS0018 - DATABASE CONSOLE COMMAND 'CHECKIDENT' IS NOT SUPPORTED. **
--DBCC CHECKIDENT(@a, RESEED, @b) WITH NO_INFOMSGS
Práticas recomendadas¶
Nenhuma ação adicional do usuário é necessária; ele é apenas informativo.
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-FDM-TS0019¶
A mensagem de erro RAISERROR pode ser diferente devido ao formato da cadeia de caracteres do SQL Server.
Descrição¶
Este EWI é adicionado para notificar que a mensagem de erro RAISERROR pode ser diferente devido ao formato da cadeia de caracteres do SQL Server.
Exemplo de código¶
Código de entrada:¶
CREATE PROCEDURE RAISERROR_PROCEDURE
AS
BEGIN
RAISERROR ('This is a sample error message with the first parameter %d and the second parameter %*.*s',
10,
1,
123,
7,
7,
'param2');
END
Código gerado:¶
CREATE OR REPLACE PROCEDURE RAISERROR_PROCEDURE ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
EXECUTE AS CALLER
AS
$$
BEGIN
--** SSC-FDM-TS0019 - RAISERROR ERROR MESSAGE MAY DIFFER BECAUSE OF THE SQL SERVER STRING FORMAT **
SELECT
RAISERROR_UDF('This is a sample error message with the first parameter %d and the second parameter %*.*s',
10,
1, array_construct(
123,
7,
7,
'param2'));
END;
$$;
Práticas recomendadas¶
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-FDM-TS0020¶
A restrição padrão foi transformada em comentário e pode ter sido adicionada a uma definição de tabela.
Descrição¶
Esta FDM é adicionada quando a restrição padrão está presente em uma instrução Alter table.
Atualmente, o suporte para essa restrição não está disponível. Uma solução alternativa para transformá-la é definir a tabela antes de usar Alter Table. Isso permite que o SnowConvert AI identifique as referências e a restrição padrão seja consolidada na definição da tabela. Caso contrário, a restrição é apenas comentada.
Exemplo de código¶
Código de entrada:¶
CREATE TABLE table1(
col1 integer,
col2 varchar collate Latin1_General_CS,
col3 date
);
ALTER TABLE table1
ADD col4 integer,
CONSTRAINT col1_constraint DEFAULT 50 FOR col1,
CONSTRAINT col1_constraint DEFAULT (getdate()) FOR col1;
Código gerado:¶
CREATE OR REPLACE TABLE table1 (
col1 INTEGER DEFAULT 50,
col2 VARCHAR COLLATE 'EN-CS',
col3 DATE
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"transact"}}'
;
ALTER TABLE table1
ADD col4 INTEGER;
----** SSC-FDM-TS0020 - DEFAULT CONSTRAINT MAY HAVE BEEN ADDED TO TABLE DEFINITION **
--ALTER TABLE table1
--ADD
--CONSTRAINT col1_constraint DEFAULT 50 FOR col1
;
----** SSC-FDM-TS0020 - DEFAULT CONSTRAINT MAY HAVE BEEN ADDED TO TABLE DEFINITION **
--ALTER TABLE table1
--ADD
--CONSTRAINT col1_constraint DEFAULT (CURRENT_TIMESTAMP() :: TIMESTAMP) FOR col1
;
Problemas conhecidos¶
Quando diferentes restrições padrão são declaradas na mesma coluna, apenas a primeira é refletida na instrução Create Table.
Quando uma restrição padrão é declarada em uma coluna ausente, a transformação não pode ser realizada devido à falta de dependências.
Práticas recomendadas¶
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-FDM-TS0021¶
Um MASKING POLICY foi criado como substituto para MASKED WITH.
Nota
Algumas partes do código de saída foram omitidas por motivos de clareza.
Descrição¶
Este EWI é adicionado quando a instrução Alter Table contém uma cláusula MASKED WITH. O motivo pelo qual isto é adicionado é informar que um valor MASKING POLICY aproximado foi criado como substituto para a função MASKED WITH.
Exemplo de código¶
Código de entrada:¶
ALTER TABLE table_name
ALTER COLUMN column_name
ADD MASKED WITH (FUNCTION = 'default()');
Código gerado:¶
--** SSC-FDM-TS0022 - MASKING ROLE MUST BE DEFINED PREVIOUSLY BY THE USER **
CREATE OR REPLACE MASKING POLICY "default" AS
(val STRING)
RETURNS STRING ->
CASE
WHEN current_role() IN ('YOUR_DEFINED_ROLE_HERE')
THEN val
ELSE 'xxxxx'
END;
ALTER TABLE IF EXISTS table_name MODIFY COLUMN column_name/*** SSC-FDM-TS0021 - A MASKING POLICY WAS CREATED AS SUBSTITUTE FOR MASKED WITH ***/ SET MASKING POLICY "default";
Nota
MASKING POLICY será criado antes da instrução ALTER TABLE. E espera-se que tenha um comportamento aproximado. Alguns ajustes podem ser necessários em relação a funções e privilégios de usuário.
Práticas recomendadas¶
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-FDM-TS0022¶
O usuário deve definir previamente a função de mascaramento.
Nota
Algumas partes do código de saída foram omitidas por motivos de clareza.
Descrição¶
Este EWI ocorre quando uma MASKING POLICY é criada e uma função ou privilégio deve ser vinculado a ela para que o mascaramento de dados possa funcionar corretamente.
Exemplo de código¶
Código de entrada¶
ALTER TABLE tableName
ALTER COLUMN columnName
ADD MASKED WITH (FUNCTION = 'partial(1, "xxxxx", 1)');
Código gerado:¶
--** SSC-FDM-TS0022 - MASKING ROLE MUST BE DEFINED PREVIOUSLY BY THE USER **
CREATE OR REPLACE MASKING POLICY "partial_1_xxxxx_1" AS
(val STRING)
RETURNS STRING ->
CASE
WHEN current_role() IN ('YOUR_DEFINED_ROLE_HERE')
THEN val
ELSE LEFT(val, 1) || 'xxxxx' || RIGHT(val, 1)
END;
ALTER TABLE IF EXISTS tableName MODIFY COLUMN columnName/*** SSC-FDM-TS0021 - A MASKING POLICY WAS CREATED AS SUBSTITUTE FOR MASKED WITH ***/ SET MASKING POLICY "partial_1_xxxxx_1";
Nota
Como mostrado na linha 6, há um espaço reservado onde as funções definidas podem ser colocadas. Há espaço para um ou vários valores separados por vírgulas. Além disso, aqui, o uso de aspas simples é obrigatório para cada um dos valores.
Práticas recomendadas¶
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-FDM-TS0023¶
A função de erro pode ser diferente no Snowflake.
Descrição¶
Este EWI é adicionado na transformação das seguintes funções ERRORs devido à mudança de comportamento correspondente.
ERROR_MESSAGE A mensagem de SQLERRM pode ser diferente no Snowflake.
ERROR_STATE A propriedade SQLSTATE de destino pode retornar um número diferente devido a diferenças de plataforma.
ERROR_PROCEDURE A transformação foi alterada para retornar o procedimento armazenado em que a função é chamada.
Código de entrada:¶
CREATE PROCEDURE ProcError
AS
BEGIN
Declare @ErrorState INT = ERROR_STATE();
Declare @ErrorMessage INT = ERROR_MESSAGE();
Declare @ErrorProc INT = ERROR_PROCEDURE();
Select 1;
END;
Código gerado¶
CREATE OR REPLACE PROCEDURE ProcError ()
RETURNS TABLE()
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "transact", "convertedOn": "09/01/2025", "domain": "no-domain-provided" }}'
EXECUTE AS CALLER
AS
$$
DECLARE
ERRORSTATE INT := SQLSTATE /*** SSC-FDM-TS0023 - ERROR STATE COULD BE DIFFERENT IN SNOWFLAKE ***/;
ERRORMESSAGE INT := SQLERRM /*** SSC-FDM-TS0023 - ERROR MESSAGE COULD BE DIFFERENT IN SNOWFLAKE ***/;
ERRORPROC INT := 'ProcError' /*** SSC-FDM-TS0023 - ERROR PROCEDURE NAME COULD BE DIFFERENT IN SNOWFLAKE ***/;
ProcedureResultSet RESULTSET;
BEGIN
ProcedureResultSet := (
Select 1);
RETURN TABLE(ProcedureResultSet);
END;
$$;
Recomendação¶
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com.
SSC-FDM-TS0024¶
CURRENT_TIMESTAMP na instrução At Time Zone pode ter um comportamento diferente em certos casos.
Descrição¶
Esta FDM é adicionada quando At Time Zone contém CURRENT_TIMESTAMP. Isso ocorre porque o resultado pode ser diferente em algumas instâncias.
A principal diferença é que, no SQL Server, CURRENT_TIMESTAMP retorna a data e hora atuais do sistema no fuso horário do servidor, enquanto no Snowflake, CURRENT_TIMESTAMP retorna a data e hora atuais no fuso horário UTC (Tempo Universal Coordenado).
Código de entrada:¶
Servidor Sql¶
SELECT current_timestamp at time zone 'Hawaiian Standard Time';
Resultado¶
2024-02-08 16:52:55.317 -10:00
Código gerado:¶
Snowflake¶
SELECT
CONVERT_TIMEZONE('Pacific/Honolulu', CURRENT_TIMESTAMP() /*** SSC-FDM-TS0024 - CURRENT_TIMESTAMP in At Time Zone statement may have a different behavior in certain cases ***/);
Resultado¶
2024-02-08 06:53:46.994 -1000
Práticas recomendadas¶
Este é um exemplo caso você queira manter o mesmo formato no Snowflake.
SQL Server¶
SELECT current_timestamp at time zone 'Hawaiian Standard Time';
Resultado¶
2024-02-08 16:33:49.143 -10:00
No Snowflake, você pode usar ALTER SESSION para alterar o fuso horário padrão. Por exemplo:
Snowflake¶
ALTER SESSION SET TIMEZONE = 'Pacific/Honolulu';
SELECT
CONVERT_TIMEZONE('Pacific/Honolulu', 'UTC', CURRENT_TIMESTAMP());
Resultado¶
2024-02-08 16:33:49.143
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-FDM-TS0025¶
DB_ID_UDF pode ter um comportamento diferente em certos casos.
Descrição¶
Esta FDM é adicionada para esclarecer que DB_ID_UDF tenta emular a função DB_ID SqlServer da melhor maneira possível. No SqlServer, o identificador designado a um banco de dados é único e, se o banco de dados for excluído, este ID nunca mais será utilizado; caso contrário, no Snowflake, esse identificador corresponde ao número designado ao banco de dados quando ele é criado. Ele também é único, mas é um número consecutivo, o que significa que, se este banco de dados for excluído, esse número será designado ao banco de dados que foi criado após o excluído.
Código de entrada:¶
Servidor Sql¶
SELECT DB_ID('my_database');
Resultado¶
6
Código gerado:¶
Snowflake¶
SELECT
DB_ID_UDF('my_database') /*** SSC-FDM-TS0025 - DB_ID_UDF MAY HAVE A DIFFERENT BEHAVIOR IN CERTAIN CASES ***/;
Resultado¶
6
Práticas recomendadas¶
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-FDM-TS0026¶
O caso DELETE não está sendo considerado na tabela temporária.
Descrição¶
Existe um padrão de instrução INSERT que requer uma transformação específica, que envolve a criação de uma tabela temporária. Esta FDM notifica que o caso DELETE não é considerado na transformação mencionada. Acesse INSERT com fator DML de tabela com MERGE como DML para obter mais informações sobre esse padrão.
Código de entrada:¶
Servidor Sql¶
INSERT INTO T3
SELECT
col1,
col2
FROM (
MERGE T1 USING T2
ON T1.col1 = T2.col1
WHEN NOT MATCHED THEN
INSERT VALUES ( T2.col1, T2.col2 )
WHEN MATCHED THEN
UPDATE SET T1.col2 = t2.col2
OUTPUT
$action ACTION_OUT,
T2.col1,
T2.col2
) AS MERGE_OUT
WHERE ACTION_OUT='UPDATE';
Código gerado:¶
Snowflake¶
--** SSC-FDM-TS0026 - DELETE CASE IS NOT BEING CONSIDERED, PLEASE CHECK IF THE ORIGINAL MERGE PERFORMS IT **
CREATE OR REPLACE TEMPORARY TABLE MERGE_OUT AS
SELECT
CASE
WHEN T1.$1 IS NULL
THEN 'INSERT'
ELSE 'UPDATE'
END ACTION_OUT,
T2.col1,
T2.col2
FROM
T2
LEFT JOIN
T1
ON T1.col1 = T2.col1;
MERGE INTO T1
USING T2
ON T1.col1 = T2.col1
WHEN NOT MATCHED THEN
INSERT VALUES (T2.col1, T2.col2)
WHEN MATCHED THEN
UPDATE SET
T1.col2 = t2.col2
!!!RESOLVE EWI!!! /*** SSC-EWI-0021 - OUTPUT CLAUSE NOT SUPPORTED IN SNOWFLAKE ***/!!!
OUTPUT
$action ACTION_OUT,
T2.col1,
T2.col2 ;
INSERT INTO T3
SELECT
col1,
col2
FROM
MERGE_OUT
WHERE
ACTION_OUT ='UPDATE';
Práticas recomendadas¶
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-FDM-TS0027¶
A instrução SET ANSI_NULLS ON pode ter um comportamento diferente no Snowflake.
Descrição¶
Esta FDM notifica que a instrução SET ANSI_NULLS ON pode se comportar de maneira diferente no Snowflake. Para obter mais informações sobre esta instrução, consulte o artigo ANSI_NULLS.
Código de entrada¶
SET ANSI_NULLS ON;
Código gerado¶
----** SSC-FDM-TS0027 - SET ANSI_NULLS ON STATEMENT MAY HAVE A DIFFERENT BEHAVIOR IN SNOWFLAKE **
--SET ANSI_NULLS ON
Práticas recomendadas¶
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-FDM-TS0028¶
Os parâmetros de saída devem estar na mesma ordem em que aparecem no código executado.
Descrição¶
Esta FDM notifica que os parâmetros de saída na instrução SP_EXECUTESQL devem estar na mesma ordem em que aparecem na cadeia de caracteres SQL para serem executados. Caso contrário, os valores de saída não serão atribuídos corretamente.
Exemplo de código¶
Caso correto¶
Conforme mostrado, @MaxAgeOUT e @MaxIdOUT aparecem na mesma ordem tanto na cadeia de caracteres SQL quanto nos parâmetros de saída.
Assim, durante a conversão do código, SELECT $1, $2 INTO :MAXAGE, :MAXID FROM TABLE(RESULT_SCAN(LAST_QUERY_ID())) atribuirá os valores corretamente.
Transact¶
CREATE PROCEDURE CORRECT_OUTPUT_PARAMS_ORDER
AS
BEGIN
DECLARE @MaxAge INT;
DECLARE @MaxId INT;
EXECUTE sp_executesql
N'SELECT @MaxAgeOUT = max(AGE), @MaxIdOut = max(ID) FROM PERSONS WHERE ID < @id AND AGE < @age;',
N'@age INT, @id INT, @MaxAgeOUT INT OUTPUT, @MaxIdOUT INT OUTPUT',
30,
100,
@MaxAgeOUT = @MaxAge OUTPUT,
@MaxIdOut = @MaxId OUTPUT;
SELECT @MaxAge, @MaxId;
END
Snowflake¶
CREATE OR REPLACE PROCEDURE CORRECT_OUTPUT_PARAMS_ORDER ()
RETURNS TABLE()
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "transact", "convertedOn": "10/07/2024" }}'
EXECUTE AS CALLER
AS
$$
DECLARE
MAXAGE INT;
MAXID INT;
ProcedureResultSet RESULTSET;
BEGIN
!!!RESOLVE EWI!!! /*** SSC-EWI-0030 - THE STATEMENT BELOW HAS USAGES OF DYNAMIC SQL. ***/!!!
EXECUTE IMMEDIATE TRANSFORM_SP_EXECUTE_SQL_STRING_UDF('SELECT
MAX(AGE),
MAX(ID) FROM
PERSONS
WHERE
ID < @id AND AGE < @age;', '@age INT, @id INT, @MaxAgeOUT INT OUTPUT, @MaxIdOUT INT OUTPUT', ARRAY_CONSTRUCT('', '', 'MAXAGEOUT', 'MAXIDOUT'), ARRAY_CONSTRUCT(
30,
100, :MAXAGE, :MAXID));
--** SSC-FDM-TS0028 - OUTPUT PARAMETERS MUST HAVE THE SAME ORDER AS THEY APPEAR IN THE EXECUTED CODE **
SELECT
$1,
$2
INTO
:MAXAGE,
:MAXID
FROM
TABLE(RESULT_SCAN(LAST_QUERY_ID()));
ProcedureResultSet := (
SELECT
:MAXAGE,
:MAXID);
RETURN TABLE(ProcedureResultSet);
END;
$$;
Caso problemático¶
Conforme mostrado, @MaxAgeOUT e @MaxIdOUT nos parâmetros de saída aparecem em uma ordem diferente em comparação com a cadeia de caracteres SQL.
Assim, durante a conversão do código, SELECT $1, $2 INTO :MAXID, :MAXAGE FROM TABLE(RESULT_SCAN(LAST_QUERY_ID())) atribuirá os valores incorretamente. Max(AGE) será atribuído a :MAXID, e Max(ID) a :MAXAGE.
Isso precisa ser corrigido manualmente com a alteração da ordem dos parâmetros de saída na instrução SELECT INTO ou com a alteração da ordem na cadeia de caracteres SQL.
Transact¶
CREATE PROCEDURE INCORRECT_OUTPUT_PARAMS_ORDER
AS
BEGIN
DECLARE @MaxAge INT;
DECLARE @MaxId INT;
EXECUTE sp_executesql
N'SELECT @MaxAgeOUT = max(AGE), @MaxIdOut = max(ID) FROM PERSONS WHERE ID < @id AND AGE < @age;',
N'@age INT, @id INT, @MaxAgeOUT INT OUTPUT, @MaxIdOUT INT OUTPUT',
30,
100,
@MaxIdOut = @MaxId OUTPUT,
@MaxAgeOUT = @MaxAge OUTPUT;
SELECT @MaxAge, @MaxId;
END
Snowflake¶
CREATE OR REPLACE PROCEDURE INCORRECT_OUTPUT_PARAMS_ORDER ()
RETURNS TABLE()
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "transact", "convertedOn": "10/07/2024" }}'
EXECUTE AS CALLER
AS
$$
DECLARE
MAXAGE INT;
MAXID INT;
ProcedureResultSet RESULTSET;
BEGIN
!!!RESOLVE EWI!!! /*** SSC-EWI-0030 - THE STATEMENT BELOW HAS USAGES OF DYNAMIC SQL. ***/!!!
EXECUTE IMMEDIATE TRANSFORM_SP_EXECUTE_SQL_STRING_UDF('SELECT
MAX(AGE),
MAX(ID) FROM
PERSONS
WHERE
ID < @id AND AGE < @age;', '@age INT, @id INT, @MaxAgeOUT INT OUTPUT, @MaxIdOUT INT OUTPUT', ARRAY_CONSTRUCT('', '', 'MAXIDOUT', 'MAXAGEOUT'), ARRAY_CONSTRUCT(
30,
100, :MAXID, :MAXAGE));
--** SSC-FDM-TS0028 - OUTPUT PARAMETERS MUST HAVE THE SAME ORDER AS THEY APPEAR IN THE EXECUTED CODE **
SELECT
$1,
$2
INTO
:MAXID,
:MAXAGE
FROM
TABLE(RESULT_SCAN(LAST_QUERY_ID()));
ProcedureResultSet := (
SELECT
:MAXAGE,
:MAXID);
RETURN TABLE(ProcedureResultSet);
END;
$$;
Práticas recomendadas¶
Certifique-se de que os parâmetros OUTPUT estejam na mesma ordem em que aparecem na cadeia de caracteres SQL.
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-FDM-TS0029¶
A instrução SET NOCOUNT foi transformada em comentário, o que não se aplica ao Snowflake.
Descrição¶
Quando o SnowConvert AI encontra uma instrução SET NOCOUNT, adiciona esta FDM. O SnowConvert AI então comenta a instrução SET NOCOUNT porque ela não é relevante no ambiente Snowflake.
Exemplo de código¶
Código de entrada:¶
SET NOCOUNT ON;
Código gerado¶
----** SSC-FDM-TS0029 - SET NOCOUNT STATEMENT IS COMMENTED OUT, WHICH IS NOT APPLICABLE IN SNOWFLAKE. **
--SET NOCOUNT ON
Práticas recomendadas¶
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-FDM-TS0030¶
A instrução SET ANSI_PADDING ON foi transformada em comentário, o que é equivalente no Snowflake.
Descrição¶
O Snowflake sempre preserva espaços finais em valores de cadeia de caracteres quando eles são inseridos em colunas. Esse comportamento é equivalente a SET ANSI_PADDING ON no SQL Server. Portanto, quando o SnowConvert AI encontra uma instrução SET ANSI_PADDING ON, adiciona esta FDM e a transforma em comentário.
Exemplo de código¶
Código de entrada:¶
SET ANSI_PADDING ON;
Código gerado¶
----** SSC-FDM-TS0030 - SET ANSI_PADDING ON STATEMENT IS COMMENTED OUT, WHICH IS EQUIVALENT IN SNOWFLAKE. **
--SET ANSI_PADDING ON
Práticas recomendadas¶
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-FDM-TS0031¶
A instrução SET ANSI_WARNINGS ON foi transformada em comentário, o que geralmente indica que o Snowflake segue os comportamentos do padrão ANSI.
Descrição¶
O Snowflake geralmente se comporta como se ANSI_WARNINGS fosse ON por padrão, especialmente em relação ao tratamento de erros para estouro aritmético, divisão por zero e truncamento de cadeia de caracteres. Normalmente, você não precisa «definir» explicitamente um equivalente a ANSI_WARNINGS no Snowflake. Portanto, quando o encontra uma instrução SnowConvert AI ON`, adiciona esta FDM e a transforma em comentário.
Exemplo de código¶
Código de entrada:¶
SET ANSI_WARNINGS ON;
Código gerado¶
----** SSC-FDM-TS0031 - SET ANSI_WARNINGS ON STATEMENT IS COMMENTED OUT, WHICH SNOWFLAKE GENERALLY ADHERES TO ANSI-STANDARD BEHAVIORS. **
--SET ANSI_WARNINGS ON
Práticas recomendadas¶
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-FDM-TS0032¶
A propriedade de coluna IDENTITY não é compatível em CREATE TABLE AS STATEMENT, emulada usando ROW_NUMBER().
Descrição¶
O Snowflake não tem uma maneira direta de realizar CREATE TABLE AS com uma coluna de identidade. Embora o SnowConvert adicione uma coluna ROW_NUMBER em vez de IDENTITY para simular a enumeração da identidade. Essa transformação não cria uma coluna de identidade, o que significa que as linhas inseridas após a criação não serão incrementadas automaticamente.
Exemplo de código¶
Código de entrada:¶
with peers as
(
select
*
from (
values
('Luis', 'Miguel'),
('Cory', 'Wong'),
('Steve', 'Vai'),
('John', 'Petrucci'),
('Paul', 'Gilbert')
) as info(name, lastname)
)
select
rowm = IDENTITY(int,1,1),
*
into #MYTABLE
from peers;
Código gerado¶
--** SSC-FDM-TS0032 - IDENTITY COLUMN PROPERTY NOT SUPPORTED IN CREATE TABLE AS STATEMENT, EMULATED WITH USING ROW_NUMBER **
CREATE OR REPLACE TEMPORARY TABLE T_MYTABLE AS
WITH peers as
(
select
*
from (
values
('Luis', 'Miguel'),
('Cory', 'Wong'),
('Steve', 'Vai'),
('John', 'Petrucci'),
('Paul', 'Gilbert')
) as info (
name,
lastname
)
)
SELECT
ROW_NUMBER()
OVER (
ORDER BY
NULL) AS rowm,
*
from
peers;
Práticas recomendadas¶
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-FDM-TS0033¶
SET QUOTED_IDENTIFIER STATEMENT MAY HAVE A DIFFERENT BEHAVIOR IN SNOWFLAKE.
Descrição¶
SQL Server Behavior
In SQL Server, SET QUOTED_IDENTIFIER ON is a syntax setting that is separate from collation. The database’s or column’s collation (e.g., _CI for Case-Insensitive or _CS for Case-Sensitive) dictates whether quoted identifiers are case-sensitive or not. If a database has a _CI collation, then «MyColumn» and «mycolumn» are treated as the same.
Snowflake Behavior
In Snowflake, the behavior is simpler and more strict:
Unquoted Identifiers: Automatically stored and resolved in all uppercase, making them case-insensitive (mytable is the same as MYTABLE).
Quoted Identifiers: By default, identifiers enclosed in double quotes («MyColumn») are case-sensitive. They are stored exactly as you typed them.
Exemplo de código¶
Código de entrada:¶
SET QUOTED_IDENTIFIER ON
GO
-- the table is defined as "Products Test"
-- this query will work because the case is ignored.
select
*
from [products test];
SET QUOTED_IDENTIFIER OFF
-- this query will fail because the case is preserved
select
*
from [products test];
GO
Código gerado¶
----** SSC-FDM-TS0033 - SET QUOTED_IDENTIFIER STATEMENT MAY HAVE A DIFFERENT BEHAVIOR IN SNOWFLAKE **
--SET QUOTED_IDENTIFIER ON
-- the table is defined as "Products Test"
-- this query will work because the case is ignored.
select
*
from
"products test";
----** SSC-FDM-TS0033 - SET QUOTED_IDENTIFIER STATEMENT MAY HAVE A DIFFERENT BEHAVIOR IN SNOWFLAKE **
--SET QUOTED_IDENTIFIER OFF
-- this query will fail because the case is preserved
select
*
from
"products test";
How to Achieve Equivalence in Snowflake
To get the same case-insensitive behavior for quoted identifiers as in SQL Server, you can set the QUOTED_IDENTIFIERS_IGNORE_CASE session parameter to TRUE in Snowflake.
-- This will make quoted identifiers case-insensitive for the session
ALTER SESSION SET QUOTED_IDENTIFIERS_IGNORE_CASE = TRUE;
-- Now, this query will succeed
select
*
from
"products test";
Práticas recomendadas¶
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-FDM-TS0034¶
Descrição¶
This FDM is generated when a DATA_COMPRESSION clause is encountered in a CREATE TABLE or ALTER TABLE statement. In SQL Server, DATA_COMPRESSION is used to specify whether data should be compressed (using ROW or PAGE compression) to reduce storage space and improve I/O performance. Snowflake automatically handles data compression using its proprietary compression algorithms, making the DATA_COMPRESSION clause unnecessary and unsupported. SnowConvert comments out the DATA_COMPRESSION clause during conversion.
Example Code¶
Input (SQL Server):¶
CREATE TABLE Employees (
EmployeeID INT PRIMARY KEY,
Name NVARCHAR(100),
Department NVARCHAR(50),
Salary DECIMAL(10, 2)
)
WITH (DATA_COMPRESSION = PAGE);
Output (Snowflake):¶
CREATE OR REPLACE TABLE Employees (
EmployeeID INT PRIMARY KEY,
Name NVARCHAR(100),
Department NVARCHAR(50),
Salary DECIMAL(10, 2)
)
WITH (
-- --** SSC-FDM-TS0034 - DATA_COMPRESSION IS AUTOMATICALLY HANDLED BY SNOWFLAKE. **
-- DATA_COMPRESSION = PAGE
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "transact", "convertedOn": "11/06/2025", "domain": "no-domain-provided", "migrationid": "sFmaAZAnCnm6VvGeJrE4BQ==" }}'
;
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com