SnowConvert: Problemas do SQLServer¶
SSC-EWI-TS0060¶
Gravidade¶
Medium
Descrição¶
Esse aviso aparece quando um componente de tempo não suportado é usado como parâmetro em uma função relacionada a datas no Snowflake. Para obter uma lista completa dos componentes de data e hora compatíveis, consulte a documentação de funções Date de data e hora | Snowflake.
Exemplo de código¶
Código de entrada¶
SELECT
-- Supported
DATEPART(second, getdate()),
-- Not supported
DATEPART(millisecond, getdate()),
DATEPART(microsecond, getdate());
Código de saída:¶
SELECT
-- Supported
DATE_PART(second, CURRENT_TIMESTAMP() :: TIMESTAMP),
-- Not supported
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0060 - TIME PART 'millisecond' NOT SUPPORTED AS A FUNCTION PARAMETER ***/!!!
DATEPART(millisecond, CURRENT_TIMESTAMP() :: TIMESTAMP),
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0060 - TIME PART 'microsecond' NOT SUPPORTED AS A FUNCTION PARAMETER ***/!!!
DATEPART(microsecond, CURRENT_TIMESTAMP() :: TIMESTAMP);
Recomendações¶
Você pode criar uma função definida pelo usuário (UDF) para extrair manualmente os componentes de tempo que não são diretamente compatíveis com o Snowflake.
Para obter assistência adicional, entre em contato conosco pelo e-mail snowconvert-support@snowflake.com
SSC-EWI-TS0070¶
O recurso EWI
foi descontinuado. Para obter informações atualizadas, consulte a documentação SSC-FDM-TS0024.
Descrição¶
Esse aviso aparece ao usar CURRENT_TIMESTAMP com a cláusula AT TIME ZONE. O aviso indica que os resultados podem ser inconsistentes em diferentes cenários devido à natureza dinâmica de CURRENT_TIMESTAMP.
A principal diferença entre o Microsoft SQL Server e a função CURRENT_TIMESTAMP do Snowflake é o tratamento do fuso horário:
SQL Server: Retorna a data e a hora do sistema com base no fuso horário local do servidor
Snowflake: Retorna a data e a hora em UTC (Coordinated Universal Time)
¶
SELECT current_timestamp at time zone 'Hawaiian Standard Time';
2024-02-08 16:52:55.317 -10:00
¶
SELECT
CONVERT_TIMEZONE('Pacific/Honolulu', CURRENT_TIMESTAMP() !!!RESOLVE EWI!!! /*** SSC-EWI-TS0070 - CURRENT_TIMESTAMP in At Time Zone statement may have a different behavior in certain cases ***/!!!);
2024-02-08 06:53:46.994 -1000
Recomendações¶
Aqui está um exemplo de como manter a formatação consistente no Snowflake.
SELECT current_timestamp at time zone 'Hawaiian Standard Time';
2024-02-08 16:33:49.143 -10:00
No Snowflake, você pode modificar o fuso horário padrão usando o comando ALTER SESSION. Por exemplo:
ALTER SESSION SET TIMEZONE = 'Pacific/Honolulu';
SELECT
CONVERT_TIMEZONE('Pacific/Honolulu', 'UTC', CURRENT_TIMESTAMP());
2024-02-08 16:33:49.143
Para obter suporte adicional, entre em contato com nossa equipe de suporte pelo e-mail snowconvert-support@snowflake.com
SSC-EWI-TS0044¶
Gravidade¶
Crítico
Partes do código foram omitidas para manter o exemplo claro e conciso.
Descrição¶
Esse aviso aparece ao usar a cláusula FOR XML que não está disponível no Snowflake SQL.
Exemplo de código¶
Código de entrada:¶
SELECT TOP 1 LastName
FROM AdventureWorks2019.Person.Person
FOR XML AUTO;
Código de saída:¶
SELECT TOP 1
LastName
FROM
AdventureWorks2019.Person.Person
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0044 - FOR XML AUTO CLAUSE IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
FOR XML AUTO;
Recomendações¶
Considere o uso de funções definidas pelo usuário (UDFs) para replicar a funcionalidade do seu código-fonte. Abaixo estão exemplos de UDFs que podem ajudá-lo a recriar o comportamento original:
SQL Server
CREATE TABLE TEMPTABLE (Ref INT, Des NVARCHAR(100), Qty INT)
INSERT INTO tempTable VALUES (100001, 'Normal', 1), (100002, 'Foobar', 1), (100003, 'Hello World', 2)
GO
-- FOR XML
SELECT *
FROM TempTable
FOR XML AUTO
GO
-- FOR XML RAW
SELECT *
FROM TempTable
FOR XML RAW
-- FOR XML
<TempTable Ref="100001" Des="Normal" Qty="1"/><TempTable Ref="100002" Des="Foobar" Qty="1"/><TempTable Ref="100003" Des="Hello World" Qty="2"/>
-- FOR XML RAW
<row Ref="100001" Des="Normal" Qty="1"/><row Ref="100002" Des="Foobar" Qty="1"/><row Ref="100003" Des="Hello World" Qty="2"/>
Snowflake¶
CREATE OR REPLACE TABLE TEMPTABLE (
Ref INT,
Des VARCHAR(100),
Qty INT
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
;
INSERT INTO tempTable VALUES (100001, 'Normal', 1), (100002, 'Foobar', 1), (100003, 'Hello World', 2);
-- FOR XML
SELECT
*
FROM
TempTable
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0044 - FOR XML AUTO CLAUSE IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
FOR XML AUTO;
-- FOR XML RAW
SELECT
*
FROM
TempTable
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0044 - FOR XML RAW CLAUSE IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
FOR XML RAW;
-- FOR XML
<TempTable DES="Normal" QTY="1" REF="100001" /><TempTable DES="Foobar" QTY="1" REF="100002" /><TempTable DES="Hello World" QTY="2" REF="100003" />
-- FOR XML RAW
<row DES="Normal" QTY="1" REF="100001" /><row DES="Foobar" QTY="1" REF="100002" /><row DES="Hello World" QTY="2" REF="100003" />
Para obter suporte adicional, entre em contato conosco pelo e-mail snowconvert-support@snowflake.com
SSC-EWI-TS0035¶
Gravidade¶
Medium
Partes do código foram removidas para tornar o exemplo mais claro e fácil de entender.
Descrição¶
Atualmente, o Snowflake não oferece suporte a variáveis de cursor que são declaradas, mas não inicializadas. Como resultado, um indicador de aviso antecipado (EWI) foi adicionado e o código relacionado foi comentado.
Exemplo de código¶
Código de entrada:¶
CREATE OR ALTER PROCEDURE notInitializedCursorTest
AS
BEGIN
-- Should be marked with SSC-EWI-TS0035
DECLARE @MyCursor CURSOR, @MyCursor2 CURSOR;
-- Should not be marked
DECLARE cursorVar CURSOR FORWARD_ONLY STATIC READ_ONLY
FOR
SELECT someCol
FROM someTable;
RETURN 'DONE';
END;
Código de saída:¶
CREATE OR REPLACE PROCEDURE notInitializedCursorTest ()
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-EWI-TS0035
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0035 - CURSOR VARIABLE DECLARED BUT NEVER INITIALIZED, THIS IS NOT SUPPORTED IN SNOWFLAKE SCRIPTING ***/!!!
MYCURSOR CURSOR;
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0035 - CURSOR VARIABLE DECLARED BUT NEVER INITIALIZED, THIS IS NOT SUPPORTED IN SNOWFLAKE SCRIPTING ***/!!!
MYCURSOR2 CURSOR;
-- Should not be marked
cursorVar CURSOR
FOR
SELECT
someCol
FROM
someTable;
BEGIN
RETURN 'DONE';
END;
$$;
Recomendações¶
Para obter suporte adicional, entre em contato conosco pelo e-mail snowconvert-support@snowflake.com
SSC-EWI-TS0001¶
Gravidade¶
Crítico
Partes do código de saída foram removidas para tornar o exemplo mais claro e fácil de seguir.
Descrição¶
Esse indicador de aviso de erro (EWI) aparece quando o SnowConvert encontra um erro crítico que o impede de gerar o corpo da função durante a conversão.
Exemplo de código¶
SQL Server¶
CREATE FUNCTION func1 ()
RETURNS VARCHAR
SELECT
*
FROM
TABLE1
Snowflake¶
CREATE OR REPLACE FUNCTION func1 ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"transact"}}'
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0001 - THE BODY WAS NOT GENERATED FOR FUNCTION 'func1' ***/!!!
AS
$$
$$;
Recomendações¶
Para obter suporte adicional, entre em contato com nossa equipe de suporte pelo e-mail snowconvert-support@snowflake.com
SSC-EWI-TS0025¶
Gravidade¶
Low
Gere procedimentos e macros em JavaScript adicionando o sinalizador -t JavaScript
ou --PLTargetLanguage JavaScript
ao seu comando.
Partes do código de saída foram removidas para tornar o exemplo mais claro e fácil de seguir.
Descrição¶
Esse indicador de aviso antecipado (EWI) aparece ao converter a função interna ERROR_SEVERITY. A função retorna um valor padrão de 16, que representa o nível de gravidade mais comum no SQL Server. A função definida pelo usuário gerada (UDF) deve recuperar esse valor.
Exemplo de código¶
Código de entrada:¶
-- Additional Params: -t JavaScript
CREATE procedure proc1()
as
BEGIN TRY
-- Generate a divide-by-zero error.
SELECT 1/0 from table1;
END TRY
BEGIN CATCH
return ERROR_SEVERITY();
END CATCH;
GO
Código de saída:¶
CREATE OR REPLACE PROCEDURE proc1 ()
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
EXECUTE AS CALLER
AS
$$
// SnowConvert Helpers Code section is omitted.
try {
EXEC(` -- Generate a divide-by-zero error.
SELECT
TRUNC( 1/0) from
table1`);
} catch(error) {
return SELECT(` !!!RESOLVE EWI!!! /*** SSC-EWI-TS0025 - CUSTOM UDF 'ERROR_SEVERITY_UDF' INSERTED FOR ERROR_SEVERITY FUNCTION. ***/!!!
ERROR_SEVERITY_UDF()`);
}
$$;
Recomendações¶
Para obter suporte adicional, entre em contato conosco pelo e-mail snowconvert-support@snowflake.com
SSC-EWI-TS0074¶
Gravidade¶
Low
Partes do código foram omitidas para manter o exemplo claro e conciso.
Descrição¶
Esse aviso aparece durante a conversão das funções TRY_CAST e TRY_CONVERT. Os resultados no Snowflake podem ser diferentes do original porque algumas dependências de tipo de dados não puderam ser resolvidas. Isso geralmente acontece quando as dependências necessárias não estão presentes no código-fonte.
Código de entrada:¶
SELECT TRY_CONVERT( INT, col1) FROM TABLE1;
SELECT TRY_CAST(COL1 AS FLOAT) FROM TABLE1
Código de saída¶
SELECT
CAST(col1 AS INT) /*** SSC-FDM-TS0005 - TRY_CONVERT/TRY_CAST COULD NOT BE CONVERTED TO TRY_CAST ***/!!!RESOLVE EWI!!! /*** SSC-EWI-TS0074 - CAST RESULT MAY BE DIFFERENT FROM TRY_CONVERT FUNCTION DUE TO MISSING DEPENDENCIES ***/!!!
FROM
TABLE1;
SELECT
CAST(COL1 AS FLOAT) /*** SSC-FDM-TS0005 - TRY_CONVERT/TRY_CAST COULD NOT BE CONVERTED TO TRY_CAST ***/!!!RESOLVE EWI!!! /*** SSC-EWI-TS0074 - CAST RESULT MAY BE DIFFERENT FROM TRY_CAST FUNCTION DUE TO MISSING DEPENDENCIES ***/!!!
FROM
TABLE1;
Recomendação¶
Se precisar de assistência técnica, entre em contato com nossa equipe de suporte pelo e-mail snowconvert-support@snowflake.com.
SSC-EWI-TS0034¶
Gravidade¶
High
Descrição¶
Esse aviso aparece quando o SnowConvert não consegue determinar automaticamente a estrutura da coluna para a cláusula RETURNS TABLE
de uma função durante a conversão do código. Como resultado, a cláusula RETURNS TABLE
é deixada em branco no código gerado. Isso geralmente ocorre quando as informações da coluna não podem ser inferidas a partir do código-fonte original.
Exemplo de código¶
Código de entrada:¶
CREATE FUNCTION Sales.ufn_SalesByStore2()
RETURNS TABLE
AS
RETURN
(
WITH CTE AS (
SELECT DepartmentID, Name, GroupName
FROM HumanResources.Department
)
SELECT tab.* FROM CTE tab
);
GO
SELECT * FROM GetDepartmentInfo();
Código de saída:¶
CREATE OR REPLACE FUNCTION Sales.ufn_SalesByStore2 ()
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
$$
--** SSC-PRF-TS0001 - PERFORMANCE WARNING - RECURSION FOR CTE NOT CHECKED. MIGHT REQUIRE RECURSIVE KEYWORD **
WITH CTE AS (
SELECT
DepartmentID,
Name,
GroupName
FROM
HumanResources.Department
)
SELECT tab.* FROM
CTE tab
$$;
SELECT
*
FROM GetDepartmentInfo() !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'TableValuedFunctionCall' NODE ***/!!!;
Recomendações¶
Para resolver esse problema, certifique-se de que todos os objetos necessários estejam acessíveis ao seu código. Se o problema persistir após a confirmação de que todos os objetos necessários estão disponíveis, entre em contato conosco com detalhes sobre o seu caso de uso específico.
Para obter suporte adicional, envie-nos um e-mail para snowconvert-support@snowflake.com
SSC-EWI-TS0041¶
Gravidade¶
Medium
Descrição¶
Este indicador de aviso antecipado (EWI) se aplica aos seguintes métodos de tipo de dadosXML, que atualmente não estão disponíveis no Snowflake SQL:
Value: Os dados reais ou o conteúdo armazenado em uma variável ou campo
Query: Uma solicitação para recuperar informações específicas de um banco de dados
Exist: Verifica se um determinado elemento ou condição está presente
Modify: Para alterar ou atualizar dados ou configurações existentes
Nodes: Elementos individuais ou pontos de conexão em uma estrutura de dados
Exemplo de código¶
Código de entrada:¶
CREATE PROCEDURE xml_procedure
@inUserGroupsXML XML
AS
BEGIN
SELECT entities.entity.value('TypeID[1]', 'VARCHAR(100)') AS TypeID
,entities.entity.value('Name[1]', 'VARCHAR(100)') AS Name
INTO #tmpUserGroups
FROM @inUserGroupsXML.nodes('/entities/entity') entities(entity)
END;
Código de saída:¶
CREATE OR REPLACE PROCEDURE xml_procedure (INUSERGROUPSXML TEXT)
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
EXECUTE AS CALLER
AS
$$
BEGIN
CREATE OR REPLACE TEMPORARY TABLE T_tmpUserGroups AS
SELECT
XMLGET(entity, '$') :: VARCHAR(100) AS TypeID
,
XMLGET(entity, '$') :: VARCHAR(100) AS Name
FROM
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0041 - XML TYPE METHOD nodes IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
T_inUserGroupsXML('/entities/entity') entities (
entity
);
END;
$$;
Recomendações¶
Use as Funções Definidas pelo Usuário (UDFs) para replicar a funcionalidade do seu código-fonte original
Para obter orientação sobre como lidar com os tipos de dados XML no Snowflake, consulte esta documentação
Para obter assistência adicional, entre em contato com nossa equipe de suporte pelo e-mail snowconvert-support@snowflake.com
SSC-EWI-TS0010¶
Partes do código de saída foram removidas para tornar o exemplo mais claro e fácil de seguir.
Gravidade¶
High
Descrição¶
Esse erro ocorre quando uma Common Table Expression (CTE) é usada incorretamente em uma exibição. As exibições são representações somente de leitura de consultas que definem como recuperar e exibir dados, e não como modificá-los.
Exemplo de código¶
Código de entrada:¶
Create View viewName
as
with commonTableExpressionName (
columnName
) as
(
select
1
)
((select
1 as col2)
union
(
select
1 as col3
));
Código de saída:¶
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0010 - COMMON TABLE EXPRESSION IN VIEW NOT SUPPORTED IN SNOWFLAKE. ***/!!!
CREATE OR REPLACE VIEW viewName
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"transact"}}'
AS
!!!RESOLVE EWI!!! /*** SSC-EWI-0021 - WITH CTE NOT SUPPORTED IN SNOWFLAKE ***/!!!
with commonTableExpressionName (
columnName
) as
(
select
1
)
((select
1 as col2)
union
(
select
1 as col3
));
Recomendações¶
Para obter suporte adicional, entre em contato com nossa equipe de suporte pelo e-mail snowconvert-support@snowflake.com
SSC-EWI-TS0024¶
Gravidade¶
Low
Descrição¶
Esse aviso aparece quando uma operação BULK INSERT
em um procedimento armazenado não pode ser detectada. Como resultado, as dependências necessárias para a transformação completa não serão criadas. Além disso, o comando COPY INTO
convertido tentará recuperar arquivos de um tempStage
, que deve ser criado manualmente pelo usuário.
Exemplo de código¶
Código de entrada:¶
CREATE PROCEDURE BULK_PROC2
AS
BULK INSERT dbo.table1 FROM 'E:\test.txt'
WITH
(
FIELDTERMINATOR ='\t',
ROWTERMINATOR ='\n'
);
GO
Código de saída:¶
CREATE OR REPLACE FILE FORMAT FILE_FORMAT_638461207064166040
FIELD_DELIMITER = '\t'
RECORD_DELIMITER = '\n';
CREATE OR REPLACE STAGE STAGE_638461207064166040
FILE_FORMAT = FILE_FORMAT_638461207064166040;
--** SSC-FDM-TS0004 - PUT STATEMENT IS NOT SUPPORTED ON WEB UI. YOU SHOULD EXECUTE THE CODE THROUGH THE SNOWFLAKE CLI **
PUT file://E:\test.txt @STAGE_638461207064166040 AUTO_COMPRESS = FALSE;
CREATE OR REPLACE PROCEDURE BULK_PROC2 ()
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
EXECUTE AS CALLER
AS
$$
// REGION SnowConvert Helpers Code
// END REGION
EXEC(`COPY INTO dbo.table1 FROM @STAGE_638461207064166040/test.txt`);
$$
Recomendações¶
Primeiro, crie um STAGE e um FILE FORMAT para acessar o arquivo.
Para obter assistência adicional, entre em contato com nossa equipe de suporte pelo e-mail snowconvert-support@snowflake.com
SSC-EWI-TS0075¶
Gravidade¶
Medium
Descrição¶
A conversão de procedimentos incorporada não está disponível no momento.
Exemplo de código¶
Código de entrada:¶
EXEC sp_column_privileges_rowset_rmt 'Caption';
Código de saída:¶
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0075 - TRANSLATION FOR BUILT-IN PROCEDURE 'sp_column_privileges_rowset_rmt' IS NOT CURRENTLY SUPPORTED. ***/!!!
EXEC sp_column_privileges_rowset_rmt 'Caption';
Recomendações¶
Nenhuma ação é exigida dos usuários.
Para obter suporte adicional, entre em contato conosco pelo e-mail snowconvert-support@snowflake.com
SSC-EWI-TS0055¶
Esse indicador de alerta antecipado (EWI) não está mais em uso. Consulte as informações atualizadas em SSC-FDM-TS0020.
Gravidade¶
Medium
Descrição¶
Esse aviso aparece quando uma restrição padrão é encontrada em uma instrução Alter Table.
Atualmente, não há suporte para esse tipo de restrição. No entanto, há uma solução alternativa: se a tabela for definida antes da instrução Alter Table, podemos identificar as referências e combinar a restrição padrão com a definição da tabela. Se isso não for possível, a restrição será comentada no código convertido.
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 30 FOR col1;
Código de saída:¶
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,
CONSTRAINT col1_constraint
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0055 - DEFAULT CONSTRAINT MAY HAVE BEEN ADDED TO TABLE DEFINITION ***/!!!
DEFAULT 50 FOR col1,
CONSTRAINT col1_constraint
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0055 - DEFAULT CONSTRAINT MAY HAVE BEEN ADDED TO TABLE DEFINITION ***/!!!
DEFAULT 30 FOR col1;
Se todas as instruções em um comando Alter Table forem inválidas, todo o comando Alter Table será comentado no código convertido.
Problemas conhecidos¶
Quando várias restrições padrão são definidas para a mesma coluna, apenas a primeira restrição será incluída na declaração Create Table.
Recomendações¶
Para obter suporte adicional, entre em contato com nossa equipe de suporte pelo e-mail snowconvert-support@snowflake.com
SSC-EWI-TS0061¶
Gravidade¶
Medium
Partes do código foram removidas para tornar o exemplo mais claro e fácil de entender.
Descrição¶
Esse aviso aparece quando é detectada uma instrução ALTER COLUMN não suportada.
Exemplo de código¶
Código de entrada:¶
ALTER TABLE SampleTable
ALTER COLUMN SampleColumn INT NULL SPARSE;
Código de saída:¶
ALTER TABLE IF EXISTS SampleTable
ALTER COLUMN SampleColumn
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0061 - ALTER COLUMN COMMENTED OUT BECAUSE SPARSE COLUMN IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
INT NULL SPARSE;
Recomendações¶
Para obter suporte adicional, entre em contato com nossa equipe de suporte pelo e-mail snowconvert-support@snowflake.com
SSC-EWI-TS0045¶
Gravidade¶
Low
Partes da saída do código foram removidas para manter o exemplo claro e conciso.
Descrição¶
Esse indicador de aviso antecipado (EWI) é gerado para todos os nomes de rótulos referenciados por GOTO no SQL Server.
Exemplo de código¶
Código de entrada:¶
CREATE PROCEDURE GoToProcedure
AS
BEGIN
DECLARE @TotalMaarks INT
SET @TotalMaarks = 49
IF @TotalMaarks >= 50
GOTO Pass
IF @TotalMaarks < 50
GOTO Fail
Pass:
SELECT 1;
SELECT * FROM TABLE1;
RETURN 1;
Fail:
SELECT 2;
SELECT * FROM TABLE2;
RETURN 2;
END
Código de saída:¶
CREATE OR REPLACE PROCEDURE GoToProcedure ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
EXECUTE AS CALLER
AS
$$
DECLARE
TOTALMAARKS INT;
BEGIN
TOTALMAARKS := 49;
IF (:TOTALMAARKS >= 50) THEN
!!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'GOTO' NODE ***/!!!
GOTO Pass
END IF;
IF (:TOTALMAARKS < 50) THEN
!!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'GOTO' NODE ***/!!!
GOTO Fail
END IF;
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0045 - LABELED STATEMENT IS NOT SUPPORTED IN SNOWFLAKE SCRIPTING ***/!!!
Pass:
SELECT 1;
SELECT
*
FROM
TABLE1;
RETURN 1;
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0045 - LABELED STATEMENT IS NOT SUPPORTED IN SNOWFLAKE SCRIPTING ***/!!!
Fail:
SELECT 2;
SELECT
*
FROM
TABLE2;
RETURN 2;
END;
$$;
Recomendações¶
Para obter suporte adicional, entre em contato com nossa equipe de suporte pelo e-mail snowconvert-support@snowflake.com
EWI relacionado¶
SSC-EWI-0073: Esse código requer uma revisão para garantir a equivalência funcional.
SSC-EWI-TS0009¶
Partes do código de saída foram removidas para tornar o exemplo mais claro e fácil de seguir.
Gravidade¶
High
Descrição¶
Esse erro indica a presença de transações aninhadas, que ocorrem quando uma nova transação é iniciada dentro de uma transação existente no SQL Server. Quando uma instrução BEGIN adicional é executada após a primeira, uma nova transação é criada e o contador de transações aumenta em um.
O Snowflake não oferece suporte a transações aninhadas. Quando você usar uma segunda instrução BEGIN, ela será ignorada e apenas uma transação será mantida. Para obter mais detalhes sobre o comportamento das transações do SQL Server, consulte Transações do SQL Server.
Exemplo de código¶
Código de entrada:¶
CREATE PROC transactionsTest
AS
BEGIN TRANSACTION
SELECT @@TRANCOUNT AS TransactionCount_AfterFirstTransaction
INSERT INTO TESTSCHEMA.TESTTABLE(ID) VALUES (1), (2)
BEGIN TRANSACTION
SELECT @@TRANCOUNT AS TransactionCount_AfterSecondTransaction
INSERT INTO TESTSCHEMA.TESTTABLE(ID) VALUES (3), (4)
COMMIT;
SELECT @@TRANCOUNT AS TransactionCount_AfterFirstCommit
COMMIT;
END;
Código de saída:¶
CREATE OR REPLACE PROCEDURE transactionsTest ()
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;
ProcedureResultSet3 VARCHAR;
return_arr ARRAY := array_construct();
BEGIN
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0009 - THE FOLLOWING TRANSACTION MAY CONTAIN NESTED TRANSACTIONS WHICH ARE NOT SUPPORTED IN SNOWFLAKE. ***/!!!
BEGIN TRANSACTION;
ProcedureResultSet1 := 'RESULTSET_' || REPLACE(UPPER(UUID_STRING()), '-', '_');
CREATE OR REPLACE TEMPORARY TABLE IDENTIFIER(:ProcedureResultSet1) AS
SELECT
:TRANCOUNT AS TransactionCount_AfterFirstTransaction;
return_arr := array_append(return_arr, :ProcedureResultSet1);
INSERT INTO TESTSCHEMA.TESTTABLE (ID) VALUES (1), (2);
BEGIN TRANSACTION;
ProcedureResultSet2 := 'RESULTSET_' || REPLACE(UPPER(UUID_STRING()), '-', '_');
CREATE OR REPLACE TEMPORARY TABLE IDENTIFIER(:ProcedureResultSet2) AS
SELECT
:TRANCOUNT AS TransactionCount_AfterSecondTransaction;
return_arr := array_append(return_arr, :ProcedureResultSet2);
INSERT INTO TESTSCHEMA.TESTTABLE (ID) VALUES (3), (4);
COMMIT;
ProcedureResultSet3 := 'RESULTSET_' || REPLACE(UPPER(UUID_STRING()), '-', '_');
CREATE OR REPLACE TEMPORARY TABLE IDENTIFIER(:ProcedureResultSet3) AS
SELECT
:TRANCOUNT AS TransactionCount_AfterFirstCommit;
return_arr := array_append(return_arr, :ProcedureResultSet3);
COMMIT;
--** SSC-FDM-0020 - MULTIPLE RESULT SETS ARE RETURNED IN TEMPORARY TABLES **
RETURN return_arr;
END;
$$;
-- ** SSC-EWI-0001 - UNRECOGNIZED TOKEN ON LINE '12' COLUMN '1' OF THE SOURCE CODE STARTING AT 'END'. EXPECTED 'BATCH' GRAMMAR. CODE '80'. **
--END
!!!RESOLVE EWI!!! /*** SSC-EWI-0040 - THE STATEMENT IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
;
Recomendações¶
O Snowflake ignorará as transações aninhadas em vez de gerar erros de compilação. Você pode analisar os relatórios de avaliação para identificar quaisquer transações aninhadas em seu código.
Para obter suporte adicional, entre em contato conosco pelo e-mail snowconvert-support@snowflake.com
EWI relacionado¶
SSC-FDM-0020: Os resultados de várias consultas são armazenados em tabelas temporárias
SSC-EWI-0001: Token desconhecido ou inválido encontrado na linha de código-fonte
SSC-EWI-0040: A instrução não é compatível
SSC-EWI-TS0039¶
Gravidade¶
Medium
Descrição¶
Esse aviso aparece quando são encontradas várias instruções SET para o mesmo cursor. No Snowflake Scripting, você só pode ter uma instrução SET por cursor. Quaisquer instruções SET adicionais para o mesmo cursor serão automaticamente comentadas durante a conversão.
Exemplo de código:¶
Código de entrada:¶
CREATE OR ALTER PROCEDURE multipleSetExample
AS
BEGIN
DECLARE @MyCursor CURSOR;
DECLARE @MyCursor2 CURSOR STATIC READ_ONLY
FOR
SELECT FirstName
FROM vEmployee;
DECLARE @MyCursor3 CURSOR;
SET @MyCursor = CURSOR STATIC READ_ONLY
FOR
SELECT col3
FROM defaultTable;
SET @MyCursor3 = CURSOR STATIC READ_ONLY
FOR
SELECT *
FROM someTable;
SET @MyCursor = CURSOR DYNAMIC
FOR
SELECT col2
FROM exampleTable;
SET @MyCursor2 = CURSOR STATIC READ_ONLY
FOR
SELECT col3
FROM defaultTable;
RETURN 'DONE';
END;
Código de saída:¶
CREATE OR REPLACE PROCEDURE multipleSetExample ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
EXECUTE AS CALLER
AS
$$
DECLARE
MYCURSOR CURSOR
FOR
SELECT col3
FROM defaultTable;
MYCURSOR2 CURSOR
FOR
SELECT
FirstName
FROM
vEmployee;
MYCURSOR3 CURSOR
FOR
SELECT *
FROM someTable;
BEGIN
!!!RESOLVE EWI!!! /*** SSC-EWI-0040 - THE STATEMENT IS NOT SUPPORTED IN SNOWFLAKE ***/!!!!!!RESOLVE EWI!!! /*** SSC-EWI-TS0039 - CURSOR VARIABLE MYCURSOR SET MULTIPLE TIMES, THIS IS NOT VALID IN SNOWFLAKE SCRIPTING ***/!!!
SET @MyCursor = CURSOR DYNAMIC
FOR
SELECT col2
FROM exampleTable;
!!!RESOLVE EWI!!! /*** SSC-EWI-0040 - THE STATEMENT IS NOT SUPPORTED IN SNOWFLAKE ***/!!!!!!RESOLVE EWI!!! /*** SSC-EWI-TS0039 - CURSOR VARIABLE MYCURSOR2 SET MULTIPLE TIMES, THIS IS NOT VALID IN SNOWFLAKE SCRIPTING ***/!!!
SET @MyCursor2 = CURSOR STATIC READ_ONLY
FOR
SELECT col3
FROM defaultTable;
RETURN 'DONE';
END;
$$;
Recomendações¶
Para obter suporte adicional, entre em contato com nossa equipe de suporte pelo e-mail snowconvert-support@snowflake.com
SSC-EWI-TS0078¶
Gravidade¶
Medium
Descrição¶
Esse erro ocorre quando expressões como chamadas de função, nomes de variáveis ou constantes nomeadas são colocadas após o caso padrão em uma instrução switch.
O Snowflake aceita apenas valores constantes explícitos, como números ou cadeias de caracteres, como entrada.
Exemplo de código¶
Código de entrada:¶
ALTER TABLE
T_ALTERTABLETEST
ADD
COLUMN COL10 INTEGER DEFAULT RANDOM(10);
Código de saída:¶
--** SSC-FDM-0007 - MISSING DEPENDENT OBJECTS "T_ALTERTABLETEST", "RANDOM" **
ALTER TABLE IF EXISTS T_ALTERTABLETEST
ADD
COLUMN COL10 INTEGER
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0078 - DEFAULT OPTION NOT ALLOWED IN SNOWFLAKE ***/!!!
DEFAULT RANDOM(10);
¶
Recomendações¶
Para obter suporte adicional, entre em contato conosco pelo e-mail snowconvert-support@snowflake.com
SSC-EWI-TS0079¶
Gravidade¶
Medium
Descrição¶
Esse aviso aparece quando o SnowConvert detecta uma instrução DBCC (Database Console Command) no seu código-fonte. DBCCs são comandos de manutenção de banco de dados que normalmente não são compatíveis com a arquitetura do Snowflake.
Exemplo de código¶
Código de entrada:¶
DBCC CHECKIDENT(@a, RESEED, @b) WITH NO_INFOMSGS
Código de saída:¶
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0079 - DATABASE CONSOLE COMMAND 'CHECKIDENT' IS NOT SUPPORTED. ***/!!!
DBCC CHECKIDENT(@a, RESEED, @b) WITH NO_INFOMSGS;
Recomendações¶
Esta é uma mensagem informativa que não requer nenhuma ação sua.
Para obter assistência adicional, entre em contato conosco pelo e-mail snowconvert-support@snowflake.com
SSC-EWI-TS0049¶
Partes do código foram removidas para facilitar a compreensão.
Gravidade¶
Medium
Descrição¶
A maioria das instruções IF
que contêm um bloco Begin ... End
são compatíveis e serão executadas com êxito sem gerar o erro SSC-EWI-TS0049.
Exemplo de código¶
Código de entrada:¶
CREATE OR ALTER FUNCTION [PURCHASING].[FOO](@status INT)
Returns INT
As
Begin
declare @result as int = 10;
SELECT @result = quantity FROM TABLE1 WHERE COL1 = @status;
IF @result = 3
BEGIN
IF @result>0 SELECT @result=0 ELSE SELECT @result=1
SELECT @result = 1
END
return @result;
End
Código de saída:¶
--** SSC-FDM-0029 - USER DEFINED FUNCTION WAS TRANSFORMED TO SNOWFLAKE PROCEDURE **
CREATE OR REPLACE PROCEDURE PURCHASING.FOO (STATUS INT)
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
EXECUTE AS CALLER
AS
$$
DECLARE
RESULT INT := 10;
BEGIN
SELECT
quantity
INTO
:RESULT
FROM
TABLE1
WHERE
COL1 = :STATUS;
IF (:RESULT = 3) THEN
BEGIN
IF (:RESULT >0) THEN SELECT
0
INTO
:RESULT;
ELSE
SELECT
1
INTO
:RESULT;
END IF;
SELECT
1
INTO
:RESULT;
END;
END IF;
RETURN :RESULT;
END;
$$;
Ao usar um exemplo de código básico (como o mostrado acima), a conversão funciona corretamente. No entanto, em determinados casos extremos, a instrução «IF» não é convertida corretamente, o que resulta na geração de uma mensagem EWI (Error, Warning, or Information).
Suporte manual¶
Caso 1: Instrução única¶
Nesses cenários, a transformação é simples porque a instrução convertida fará parte de uma cláusula SELECT.
IF @result = 0
BEGIN
SET @result =1
END
CASE WHEN (SELECT RESULT FROM CTE2)= 0 THEN
( SELECT 1 AS RESULT )
Caso 2: Instruções múltiplas¶
Ao transformar várias instruções SQL, converta-as sequencialmente. Comece com a primeira instrução (N) e use sua saída como a tabela de origem para a próxima instrução (N+1).
IF @result = 0
BEGIN
Statement1
Statement2
Statement3
END
CASE WHEN (SELECT RESULT FROM CTE2)= 0 THEN
(
SELECT TransformedStatement3
FROM (
SELECT TransformedStatement2
FROM (
SELECT TransformedStatement1
) T1
) T2
)
Caso 3: Instruções de múltiplos conjuntos¶
Nessas situações, você precisará criar uma transformação separada para cada instrução SET.
IF @result = 0
BEGIN
SET @var1 = 1
SET @var2 = 3
SET @var3 = @var2
END
WITH CTE1 AS (
SELECT
CASE WHEN (SELECT
RESULT
FROM
CTE0) = 0 THEN
(SELECT 1) AS VAR1)
WITH CTE2 AS (
SELECT
CASE WHEN (SELECT
RESULT
FROM
CTE0)= 0 THEN
(SELECT 3) AS VAR2)
WITH CTE3 AS (
SELECT
CASE WHEN (SELECT
RESULT
FROM
CTE0)= 0 THEN
(SELECT T1.VAR2
FROM ((SELECT 3) AS VAR2) AS T1) AS VAR3)
...
Recomendações¶
Para obter suporte adicional, entre em contato com nossa equipe de suporte pelo e-mail snowconvert-support@snowflake.com
SSC-EWI-TS0037¶
Gravidade¶
Medium
Partes do código foram removidas para tornar o exemplo mais claro e fácil de seguir.
Descrição¶
Os cursores no Snowflake Scripting só podem avançar pelo conjunto de resultados (não roláveis). Você só pode usar FETCH NEXT para recuperar registros um de cada vez.
Exemplo de código¶
Código de entrada:¶
CREATE OR ALTER PROCEDURE scrollablecursorTest
AS
BEGIN
-- Should be marked with SSC-EWI-TS0037
DECLARE CursorVar CURSOR SCROLL STATIC READ_ONLY
FOR
SELECT FirstName
FROM vEmployee;
-- Should not be marked
DECLARE CursorVar2 CURSOR STATIC READ_ONLY
FOR
SELECT FirstName
FROM vEmployee;
DECLARE CursorVar3 CURSOR FORWARD_ONLY STATIC READ_ONLY
FOR
SELECT FirstName
FROM vEmployee;
RETURN 'DONE';
END;
Código de saída:¶
CREATE OR REPLACE PROCEDURE scrollablecursorTest ()
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-EWI-TS0037
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0037 - SNOWFLAKE SCRIPTING CURSORS ARE NON-SCROLLABLE, ONLY FETCH NEXT IS SUPPORTED ***/!!!
CursorVar CURSOR
FOR
SELECT
FirstName
FROM
vEmployee;
-- Should not be marked
CursorVar2 CURSOR
FOR
SELECT
FirstName
FROM
vEmployee;
CursorVar3 CURSOR
FOR
SELECT
FirstName
FROM
vEmployee;
BEGIN
RETURN 'DONE';
END;
$$;
Recomendações¶
Para obter suporte adicional, entre em contato com nossa equipe de suporte pelo e-mail snowconvert-support@snowflake.com
SSC-EWI-TS0013¶
Esse aviso não é mais válido. Consulte SSC-FDM-TS0013 para obter a documentação atual.
Gravidade¶
Low
Descrição¶
Esse aviso aparece ao converter uma coluna computada do SQL Server para o Snowflake. Ele alerta você de que a funcionalidade pode não ser exatamente a mesma após a conversão.
Exemplo de código¶
Código de entrada:¶
CREATE TABLE [TestTable](
[Col1] AS (CONVERT ([REAL], ExpressionValue))
);
Código de saída:¶
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"}}'
;
Recomendações¶
Esta mensagem é apenas para sua informação. Nenhuma ação é necessária.
Por favor, adicione quaisquer modificações manuais às expressões que não foram transformadas automaticamente.
Para obter assistência adicional, entre em contato conosco pelo e-mail snowconvert-support@snowflake.com
SSC-EWI-TS0076¶
Essa mensagem de aviso não está mais em uso. Consulte SSC-EWI-0002 para obter a documentação atual.
Gravidade¶
Medium
Descrição¶
Os parâmetros padrão devem ser colocados no final da lista de parâmetros nos procedimentos e funções armazenados do Snowflake. Todos os parâmetros com valores padrão devem ser movidos para o final da sequência de declaração de parâmetros.
Exemplo de código¶
Código de entrada:¶
CREATE PROCEDURE MySampleProc
@Param1 NVARCHAR(50) = NULL,
@Param2 NVARCHAR(10),
@Param3 NVARCHAR(10) = NULL,
@Param4 NVARCHAR(10)
AS
SELECT 1;
Código de saída:¶
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0076 - DEFAULT PARAMETERS MAY NEED TO BE REORDERED. SNOWFLAKE ONLY SUPPORTS DEFAULT PARAMETERS AT THE END OF THE PARAMETERS DECLARATIONS. ***/!!!
CREATE OR REPLACE PROCEDURE MySampleProc (PARAM1 STRING DEFAULT NULL, PARAM2 STRING, PARAM3 STRING DEFAULT NULL, PARAM4 STRING)
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 1);
RETURN TABLE(ProcedureResultSet);
END;
$$;
Recomendações¶
Nenhuma ação é exigida dos usuários finais.
Para obter suporte adicional, entre em contato conosco pelo e-mail snowconvert-support@snowflake.com
SSC-EWI-TS0056¶
Esse aviso não é mais válido. Consulte SSC-FDM-TS0021 para obter a documentação atual.
Gravidade¶
Low
Partes do código foram removidas para tornar o exemplo mais claro e fácil de entender.
Descrição¶
Esse indicador de aviso antecipado (EWI) aparece quando uma instrução Alter Table inclui uma cláusula MASKED WITH. Isso indica que o sistema criou um MASKING POLICY aproximado para substituir 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 de saída:¶
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0057 - 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!!!RESOLVE EWI!!! /*** SSC-EWI-TS0056 - A MASKING POLICY WAS CREATED AS SUBSTITUTE FOR MASKED WITH ***/!!! SET MASKING POLICY "default";
Um MASKING POLICY deve ser criado antes da execução da instrução ALTER TABLE. Observe que o comportamento da política pode ser aproximado e pode exigir ajustes nas funções e nas permissões do usuário.
Recomendações¶
Para obter suporte adicional, entre em contato com nossa equipe de suporte pelo e-mail snowconvert-support@snowflake.com
SSC-EWI-TS0023¶
Gravidade¶
Low
Partes da saída do código foram removidas para manter o exemplo claro e conciso.
Descrição¶
Esse aviso é exibido quando uma opção do BULK INSERT
não pode ser convertida. As opções correspondentes devem ser especificadas como opções FILE FORMAT
no Snowflake.
Exemplo de código¶
Código de entrada:¶
BULK INSERT #PCE FROM 'E:\PCE_Look-up_table.txt'
WITH
(
FIELDTERMINATOR ='\t',
ROWTERMINATOR ='\n',
FIRE_TRIGGERS
);
Código de saída:¶
CREATE OR REPLACE FILE FORMAT FILE_FORMAT_638461199649565070
FIELD_DELIMITER = '\t'
RECORD_DELIMITER = '\n'
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0023 - 'FIRE_TRIGGERS' BULK OPTION COULD NOT BE TRANSFORMED TO ANY OF THE EXISTING FILE FORMAT OPTIONS ***/!!!
FIRE_TRIGGERS;
CREATE OR REPLACE STAGE STAGE_638461199649565070
FILE_FORMAT = FILE_FORMAT_638461199649565070;
--** SSC-FDM-TS0004 - PUT STATEMENT IS NOT SUPPORTED ON WEB UI. YOU SHOULD EXECUTE THE CODE THROUGH THE SNOWFLAKE CLI **
PUT file://E:\PCE_Look-up_table.txt @STAGE_638461199649565070 AUTO_COMPRESS = FALSE;
COPY INTO T_PCE FROM @STAGE_638461199649565070/PCE_Look-up_table.txt;
Recomendações¶
Acesse o guia do usuário da interface de linha de comando (CLI) do SnowSQL.
Para obter suporte adicional, entre em contato conosco pelo e-mail snowconvert-support@snowflake.com
EWI relacionado¶
SSC-FDM-TS0004: A instrução PUT não pode ser executada por meio da interface do usuário.
SSC-EWI-TS0072¶
Gravidade¶
Low
Partes do código de saída foram removidas para tornar o exemplo mais claro e fácil de seguir.
Descrição¶
Esse aviso aparece quando as instruções SELECT e os parâmetros OUTPUT precisam ser retornados. Nesses casos, os resultados das instruções SELECT têm precedência sobre os parâmetros OUTPUT.
Código de entrada:¶
CREATE PROCEDURE SOMEPROC(@product_count INT OUTPUT, @123 INT OUTPUT)
AS
BEGIN
SELECT * from AdventureWorks.HumanResources.Department;
SELECT * from AdventureWorks.HumanResources.Employee;
END
Código de saída:¶
CREATE OR REPLACE PROCEDURE SOMEPROC (PRODUCT_COUNT INT, _123 INT)
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.Employee;
return_arr := array_append(return_arr, :ProcedureResultSet2);
--** SSC-FDM-0020 - MULTIPLE RESULT SETS ARE RETURNED IN TEMPORARY TABLES **
RETURN return_arr;
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0072 - RETURN statement will be ignored due to previous RETURN statement ***/!!!
RETURN OBJECT_CONSTRUCT('PRODUCT_COUNT', :PRODUCT_COUNT, '_123', :_123);
END;
$$;
Recomendações¶
Exclua todas as instruções RETURN que devem ser ignoradas.
Para obter assistência adicional, entre em contato conosco pelo e-mail snowconvert-support@snowflake.com
EWI relacionado¶
SSC-FDM-0020: Quando vários conjuntos de resultados são retornados, eles são armazenados em tabelas temporárias.
SSC-EWI-TS0046¶
Gravidade¶
Medium
Descrição¶
Esse aviso aparece quando o código faz referência a tabelas de sistema do SQL Server que não têm um equivalente no Snowflake SQL ou que não são compatíveis com o Snowflake.
Exemplo de código¶
Código de entrada:¶
SELECT *
FROM
sys.all_sql_modules
WHERE
[STATE] = 0; -- state must be ONLINE
Código de saída:¶
SELECT
*
FROM
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0046 - SYSTEM TABLE sys.all_sql_modules IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
sys.all_sql_modules
WHERE
STATE = 0; -- state must be ONLINE
Recomendações¶
Para obter suporte adicional, entre em contato conosco pelo e-mail snowconvert-support@snowflake.com
SSC-EWI-TS0017¶
Gravidade¶
Low
Descrição¶
Esse aviso aparece quando o SnowConvert detecta uma coluna mascarada em uma instrução CREATE TABLE
. No Snowflake, o mascaramento de colunas não pode ser implementado simplesmente adicionando uma opção na definição da coluna. Para obter a mesma funcionalidade de mascaramento de dados do SQL Server, você precisará implementar manualmente a lógica de mascaramento.
Exemplo de código¶
Código de entrada:¶
CREATE TABLE TABLE1
(
[COL1] nvarchar MASKED WITH (FUNCTION = 'default()') NULL,
[COL2] varchar(100) MASKED WITH (FUNCTION = 'partial(1, "xxxxx", 1)') NULL,
[COL3] varchar(100) MASKED WITH (FUNCTION = 'email()') NOT NULL,
[COL4] smallint MASKED WITH (FUNCTION = 'random(1, 100)') NULL
);
Código de saída:¶
CREATE OR REPLACE TABLE TABLE1
(
COL1 VARCHAR
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0017 - COLUMN MASKING NOT SUPPORTED IN CREATE TABLE ***/!!!
MASKED WITH (FUNCTION = 'default()') NULL,
COL2 VARCHAR(100)
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0017 - COLUMN MASKING NOT SUPPORTED IN CREATE TABLE ***/!!!
MASKED WITH (FUNCTION = 'partial(1, "xxxxx", 1)') NULL,
COL3 VARCHAR(100)
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0017 - COLUMN MASKING NOT SUPPORTED IN CREATE TABLE ***/!!!
MASKED WITH (FUNCTION = 'email()') NOT NULL,
COL4 SMALLINT
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0017 - COLUMN MASKING NOT SUPPORTED IN CREATE TABLE ***/!!!
MASKED WITH (FUNCTION = 'random(1, 100)') NULL
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
;
Recomendações¶
O SnowConvert atualmente não oferece suporte à geração automática de MASKING POLICIES
. Você precisará criar essas políticas manualmente.
Primeiro, crie uma função que será responsável pelo gerenciamento das políticas de mascaramento.
create role masking_admin;
Em seguida, conceda os privilégios necessários à função recém-criada.
grant create masking policy on schema PUBLIC to role masking_admin;
allow table_owner role to set or unset the ssn_mask masking policy -- (optional)
grant apply on masking policy ssn_mask to role table_owner;
Crie as funções da política de mascaramento na próxima etapa.
-- default mask
create or replace masking policy default_mask as (val string) returns string ->
case
when current_role() in ('ANALYST') then val
else 'xxxx'
end;
-- partial mask
create or replace masking policy partial_mask as (val string) returns string ->
case
when current_role() in ('ANALYST') then val
else LEFT(val,1) || 'xxxxx' || RIGHT(val,1)
end;
-- email mask
create or replace masking policy email_mask as (val string) returns string ->
case
when current_role() in ('ANALYST') then val
else LEFT(val,1) || 'XXX@XXX.com'
end;
-- random mask
create or replace masking policy random_mask as (val smallint) returns smallint ->
case
when current_role() in ('ANALYST') then val
else UNIFORM(1,100,RANDOM())::SMALLINT
end;
Para demonstrar as funções de mascaramento, mostraremos exemplos de funções de mascaramento do SQL Server e suas implementações equivalentes no Snowflake.
Aplique a política de mascaramento à coluna que anteriormente tinha o mascaramento ativado no SQL Server.
alter table if exists TABLE1 modify column COL1 set masking policy default_mask;
alter table if exists TABLE1 modify column COL2 set masking policy partial_mask;
alter table if exists TABLE1 modify column COL3 set masking policy email_mask;
alter table if exists TABLE1 modify column COL4 set masking policy random_mask;
Se precisar de assistência adicional, entre em contato com nossa equipe de suporte pelo e-mail snowconvert-support@snowflake.com
SSC-EWI-TS0057¶
Esse Early Warning Indicator (EWI) foi descontinuado. Consulte a documentação SSC-FDM-TS0022 para obter informações atualizadas.
Gravidade¶
Low
Partes do código foram removidas para tornar o exemplo mais claro e fácil de entender.
Descrição¶
Esse erro ocorre quando MASKING POLICY exige uma atribuição de função ou privilégio para funcionar corretamente. Sem as permissões adequadas, o mascaramento de dados não funcionará.
Exemplo de código¶
Código de entrada¶
ALTER TABLE tableName
ALTER COLUMN columnName
ADD MASKED WITH (FUNCTION = 'partial(1, "xxxxx", 1)');
Código de saída:¶
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0057 - 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!!!RESOLVE EWI!!! /*** SSC-EWI-TS0056 - A MASKING POLICY WAS CREATED AS SUBSTITUTE FOR MASKED WITH ***/!!! SET MASKING POLICY "partial_1_xxxxx_1";
Como mostrado na linha 6, você pode adicionar um ou mais valores de função no espaço reservado, separando-os com vírgulas. Lembre-se de que cada valor de função deve ser colocado entre aspas simples.
Recomendações¶
Para obter suporte adicional, entre em contato conosco pelo e-mail snowconvert-support@snowflake.com
SSC-EWI-TS0063¶
Gravidade¶
Crítico
Descrição¶
Esse aviso aparece quando o código contém fusos horários que não são compatíveis com o Snowflake.
Exemplo de código¶
Código de entrada:¶
SELECT current_timestamp at time zone 'Turks And Caicos Standard Time';
Código de saída:¶
SELECT
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0063 - TIME ZONE NOT SUPPORTED IN SNOWFLAKE ***/!!!
CURRENT_TIMESTAMP() at time zone 'Turks And Caicos Standard Time'
;
Recomendações¶
Você pode criar uma função definida pelo usuário para lidar com diferentes fusos horários.
Para obter assistência adicional, entre em contato conosco pelo e-mail snowconvert-support@snowflake.com
SSC-EWI-TS0032¶
A External Web Interface (EWI) é gerada exclusivamente ao converter procedimentos armazenados para JavaScript. No entanto, esse recurso não é mais recomendado, pois o Snowflake Scripting é agora a linguagem preferida para procedimentos armazenados.
Gravidade¶
High
Gere procedimentos e macros em JavaScript adicionando o sinalizador -t JavaScript
ou --PLTargetLanguage JavaScript
ao seu comando.
Partes da saída do código foram removidas para tornar o exemplo mais claro.
Descrição¶
Esse aviso aparece ao converter um literal concatenado que contém uma instrução BULK INSERT
. O processo de conversão transforma BULK INSERT
em um comando Snowflake PUT
. No entanto, esse comando PUT
não pode ser executado quando se origina do SQL dinâmico.
Para lidar corretamente com as instruções BULK INSERT
, você deve executar o comando PUT
separadamente do procedimento. Se o seu procedimento contiver várias instruções BULK INSERT
no SQL dinâmico, é recomendável:
Dividir o procedimento em partes menores
Executar manualmente o comando
PUT
correspondente a cada instruçãoBULK INSERT
Essa abordagem garante o carregamento adequado de arquivos e a inserção de dados.
Exemplo de código¶
Código de entrada:¶
-- Additional Params: -t JavaScript
CREATE PROCEDURE [dbo].[Load_FuelMgtMasterData]
AS
BEGIN
SET NOCOUNT ON;
DECLARE
@SQLString VARCHAR(500)
, @ImportName VARCHAR(200)
, @Today DATE
, @Yesterday DATE
, @SourceAffiliates VARCHAR(200);
SET @Today = GETDATE();
SET @Yesterday = DATEADD(DAY, -1, @Today);
TRUNCATE TABLE dbo.SourceFM_Affiliates;
SET @ImportName = '\\' + +@@ServerName
+ '\WorkA\merchantportal\affiliates.txt';
SET @SQLString = 'BULK INSERT ' + @SourceAffiliates + ' FROM '''
+ @ImportName + '''';
EXEC (@SQLString);
END;
Código de saída:¶
CREATE OR REPLACE PROCEDURE dbo.Load_FuelMgtMasterData ()
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
EXECUTE AS CALLER
AS
$$
// SnowConvert Helpers Code section is omitted.
/*** SSC-EWI-0040 - THE STATEMENT IS NOT SUPPORTED IN SNOWFLAKE ***/
/* SET NOCOUNT ON*/
;
let SQLSTRING;
let IMPORTNAME;
let TODAY;
let YESTERDAY;
let SOURCEAFFILIATES;
TODAY = SELECT(` CURRENT_TIMESTAMP() :: TIMESTAMP`);
YESTERDAY = SELECT(` DATEADD(DAY, -1, ?)`,[TODAY]);
EXEC(`TRUNCATE TABLE dbo.SourceFM_Affiliates`);
IMPORTNAME = `\\` + SERVERNAME + `\WorkA\merchantportal\affiliates.txt`;
SQLSTRING =
// ** SSC-EWI-TS0032 - THE BULK INSERT WAS PART OF A DYNAMIC SQL, WHICH MAKES SOME OF THE TRANSLATED ELEMENTS INVALID UNLESS EXECUTED OUTSIDE DYNAMIC CODE. **
`CREATE OR REPLACE FILE FORMAT FILE_FORMAT_638461213351333410;
CREATE OR REPLACE STAGE STAGE_638461213351333410
FILE_FORMAT = FILE_FORMAT_638461213351333410;
PUT file://${IMPORTNAME} @STAGE_638461213351333410 AUTO_COMPRESS = FALSE;
COPY INTO ${SOURCEAFFILIATES} FROM @STAGE_638461213351333410/${IMPORTNAME}`;
EXEC(`${SQLSTRING}`);
$$;
Recomendações¶
Extrair e executar o comando
PUT
gerado pela instrução dinâmicaBULK INSERT
antes de executar o procedimento.Para obter assistência adicional, entre em contato conosco pelo e-mail snowconvert-support@snowflake.com
SSC-EWI-TS0073¶
Esse indicador de aviso antecipado não é mais suportado. Consulte SSC-FDM-TS0023 para obter a documentação atual.
Gravidade¶
Low
Descrição¶
Esse aviso aparece durante a transformação da função ERROR_MESSAGE(). Observe que a mensagem de erro exata pode ser diferente no Snowflake.
Código de entrada:¶
SET @varErrorMessage = ERROR_MESSAGE()
Código de saída¶
BEGIN
VARERRORMESSAGE := SQLERRM !!!RESOLVE EWI!!! /*** SSC-EWI-TS0073 - ERROR MESSAGE COULD BE DIFFERENT IN SNOWFLAKE ***/!!!;
END;
Recomendação¶
Se precisar de ajuda, entre em contato com nossa equipe de suporte pelo e-mail snowconvert-support@snowflake.com.
SSC-EWI-TS0080¶
Gravidade¶
High
Descrição¶
O comando EXECUTE AS
do SQL Server permite que os usuários mudem temporariamente seu contexto de execução. Essa alteração afeta os privilégios de execução e a saída de funções sensíveis ao contexto, como USER_NAME()
. Para retornar ao contexto original, os usuários podem usar o comando REVERT
depois de concluir suas operações.
Os procedimentos no Snowflake exigem um contexto de execução, que só pode ser definido durante a criação ou modificação do procedimento usando as instruções CREATE PROCEDURE
ou ALTER PROCEDURE
. Você não pode alterar esse contexto enquanto o procedimento estiver em execução.
Exemplo de código¶
Código de entrada:
CREATE PROCEDURE proc1()
WITH EXECUTE AS OWNER
AS
BEGIN
SELECT USER_NAME();
EXECUTE AS CALLER;
SELECT USER_NAME();
REVERT;
SELECT USER_NAME();
END
GO
Código de saída:
CREATE OR REPLACE PROCEDURE proc1 ()
RETURNS ARRAY
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "transact", "convertedOn": "07/05/2024" }}'
EXECUTE AS OWNER
AS
$$
DECLARE
ProcedureResultSet1 VARCHAR;
ProcedureResultSet2 VARCHAR;
ProcedureResultSet3 VARCHAR;
return_arr ARRAY := array_construct();
BEGIN
ProcedureResultSet1 := 'RESULTSET_' || REPLACE(UPPER(UUID_STRING()), '-', '_');
CREATE OR REPLACE TEMPORARY TABLE IDENTIFIER(:ProcedureResultSet1) AS
SELECT
CURRENT_USER();
return_arr := array_append(return_arr, :ProcedureResultSet1);
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0080 - CHANGING THE EXECUTION CONTEXT AT RUNTIME IS NOT SUPPORTED IN SNOWFLAKE. ***/!!!
EXECUTE AS CALLER;
ProcedureResultSet2 := 'RESULTSET_' || REPLACE(UPPER(UUID_STRING()), '-', '_');
CREATE OR REPLACE TEMPORARY TABLE IDENTIFIER(:ProcedureResultSet2) AS
SELECT
CURRENT_USER();
return_arr := array_append(return_arr, :ProcedureResultSet2);
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0080 - CHANGING THE EXECUTION CONTEXT AT RUNTIME IS NOT SUPPORTED IN SNOWFLAKE. ***/!!!
REVERT;
ProcedureResultSet3 := 'RESULTSET_' || REPLACE(UPPER(UUID_STRING()), '-', '_');
CREATE OR REPLACE TEMPORARY TABLE IDENTIFIER(:ProcedureResultSet3) AS
SELECT
CURRENT_USER();
return_arr := array_append(return_arr, :ProcedureResultSet3);
--** SSC-FDM-0020 - MULTIPLE RESULT SETS ARE RETURNED IN TEMPORARY TABLES **
RETURN return_arr;
END;
$$;
Recomendações¶
Modifique o código para funcionar sem alternância de contexto.
Para obter assistência adicional, entre em contato conosco pelo e-mail snowconvert-support@snowflake.com
SSC-EWI-TS0047¶
Esse aviso não é mais válido. Consulte SSC-FDM-TS0019 para obter a documentação atual.
Gravidade¶
Low
Descrição¶
Esse aviso indica que a mensagem de erro RAISERROR pode ser diferente devido às regras de formatação de cadeias de caractere 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 de saída:¶
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
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0047 - 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;
$$;
Recomendações¶
Para obter suporte adicional, entre em contato com nossa equipe de suporte pelo e-mail snowconvert-support@snowflake.com
SSC-EWI-TS0016¶
Partes do código foram removidas para tornar o exemplo mais claro e fácil de seguir.
Descrição¶
Esse aviso aparece quando o SnowConvert detecta uma função ODBC Scalar em seu código-fonte. Observe que as funções ODBC Scalar não podem ser convertidas em funções definidas pelo usuário no Snowflake.
Exemplo de código¶
Código de entrada:¶
SELECT {fn CURRENT_DATE_UDF()};
Código de saída:¶
SELECT
!!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'CURRENT_DATE_UDF' NODE ***/!!!
CURRENT_DATE_UDF() !!!RESOLVE EWI!!! /*** SSC-EWI-TS0016 - USER DEFINED FUNCTIONS ARE NOT SUPPORTED IN ODBC SCALAR FUNCTION. ***/!!!;
EWI relacionado¶
SSC-EWI-0073: É necessária uma análise de equivalência funcional.
Recomendações¶
Isso é apenas para sua informação. Nenhuma ação é necessária.
Para obter assistência adicional, entre em contato conosco pelo e-mail snowconvert-support@snowflake.com
SSC-EWI-TS0036¶
Gravidade¶
Medium
Partes do código foram omitidas para manter o exemplo claro e conciso.
Descrição¶
Esse aviso aparece quando o código contém tipos de Cursor que não são Cursores Locais. Como o Snowflake Scripting atualmente só suporta Cursores Locais, todos os tipos de Cursores serão automaticamente convertidos em Cursores Locais durante a conversão.
Exemplo de código¶
Código de entrada:¶
CREATE OR ALTER PROCEDURE globalCursorTest
AS
BEGIN
-- Should be marked with SSC-EWI-TS0036
DECLARE MyCursor CURSOR GLOBAL STATIC READ_ONLY
FOR
SELECT *
FROM exampleTable;
-- Should not be marked
DECLARE MyCursor2 CURSOR LOCAL STATIC READ_ONLY
FOR
SELECT testCol
FROM myTable;
RETURN 'DONE';
END;
CREATE OR REPLACE PROCEDURE globalCursorTest ()
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-EWI-TS0036
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0036 - SNOWFLAKE SCRIPTING ONLY SUPPORTS LOCAL CURSORS ***/!!!
MyCursor CURSOR
FOR
SELECT
*
FROM
exampleTable;
-- Should not be marked
MyCursor2 CURSOR
FOR
SELECT
testCol
FROM
myTable;
BEGIN
RETURN 'DONE';
END;
$$;
Recomendações¶
Para obter suporte adicional, entre em contato conosco pelo e-mail snowconvert-support@snowflake.com
SSC-EWI-TS0067¶
Gravidade¶
Crítico
Partes da saída do código foram removidas para manter o exemplo claro e conciso.
Descrição¶
Esse aviso aparece quando OPENXML contém parâmetros inválidos, especialmente quando o caminho XML especificado está inacessível.
Para resolver esse indicador de aviso antecipado (EWI), você deve fornecer o caminho completo do nó nos parâmetros.
Código de entrada:¶
SELECT
*
FROM
OPENXML (@idoc, @path, 1) WITH (
CustomerID VARCHAR(10),
ContactName VARCHAR(20)
);
Código de saída:¶
SELECT
*
FROM
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0067 - INVALID PARAMETERS IN OPENXML TABLE-VALUED FUNCTION ***/!!!
OPENXML(@idoc, @path, 1);
Código de entrada (parâmetro explícito)¶
SELECT
*
FROM
OPENXML (@idoc, '/ROOT/Customer', 1) WITH(
CustomerID VARCHAR(10),
ContactName VARCHAR(20)
);
Código de saída (parâmetro explícito)¶
SELECT
Left(value:Customer['@CustomerID'], '10') AS 'CustomerID',
Left(value:Customer['@ContactName'], '20') AS 'ContactName'
FROM
OPENXML_UDF($idoc, ':ROOT:Customer');
Recomendações¶
Verifique se você pode passar o caminho diretamente como um parâmetro em seu código.
Para obter assistência adicional, entre em contato com nossa equipe de suporte pelo e-mail snowconvert-support@snowflake.com
SSC-EWI-TS0043¶
Gravidade¶
Medium
Partes da saída do código foram removidas para manter o exemplo claro e conciso.
Descrição¶
Esse aviso aparece para a cláusula WITH XMLNAMESPACES que não está disponível no Snowflake SQL.
Exemplo de código¶
Código de entrada:¶
WITH XMLNAMESPACES ('uri' as ns1)
SELECT ProductID as 'ns1:ProductID',
Name as 'ns1:Name',
Color as 'ns1:Color'
FROM Production.Product
WHERE ProductID = 316
FOR XML RAW, ELEMENTS XSINIL
Código de saída:¶
--** SSC-PRF-TS0001 - PERFORMANCE WARNING - RECURSION FOR CTE NOT CHECKED. MIGHT REQUIRE RECURSIVE KEYWORD **
WITH
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0043 - WITH XMLNAMESPACES IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
XMLNAMESPACES ('uri' as VARIANT /*** SSC-FDM-TS0015 - DATA TYPE NS1 IS NOT SUPPORTED IN SNOWFLAKE ***/)
SELECT
ProductID AS "ns1:ProductID",
Name AS "ns1:Name",
Color AS "ns1:Color"
FROM
Production.Product
WHERE
ProductID = 316
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0044 - FOR XML RAW CLAUSE IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
FOR XML RAW, ELEMENTS XSINIL;
Recomendações¶
Considere o uso de funções definidas pelo usuário (UDFs) para replicar a funcionalidade do seu código-fonte. A seguir, você encontrará exemplos de UDFs que podem ajudá-lo a recriar o comportamento original:
CREATE TABLE PRODUCT (ProductID INTEGER, Name VarChar(20), Color VarChar(20));
INSERT INTO PRODUCT(PRODUCTID, NAME, COLOR) VALUES(1,'UMBRELLA','RED');
INSERT INTO PRODUCT(PRODUCTID, NAME, COLOR) VALUES(2,'SHORTS','BLUE');
INSERT INTO PRODUCT(PRODUCTID, NAME, COLOR) VALUES(3,'BALL','YELLOW');
WITH XMLNAMESPACES ('uri' as ns1)
SELECT ProductID as 'ns1:ProductID',
Name as 'ns1:Name',
Color as 'ns1:Color'
FROM Product
FOR XML RAW
CREATE OR REPLACE TABLE PRODUCT (
ProductID INTEGER,
Name VARCHAR(20),
Color VARCHAR(20))
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "transact", "convertedOn": "07/12/2024" }}'
;
INSERT INTO PRODUCT (PRODUCTID, NAME, COLOR) VALUES(1,'UMBRELLA','RED');
INSERT INTO PRODUCT (PRODUCTID, NAME, COLOR) VALUES(2,'SHORTS','BLUE');
INSERT INTO PRODUCT (PRODUCTID, NAME, COLOR) VALUES(3,'BALL','YELLOW');
--** SSC-PRF-TS0001 - PERFORMANCE WARNING - RECURSION FOR CTE NOT CHECKED. MIGHT REQUIRE RECURSIVE KEYWORD **
WITH
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0043 - WITH XMLNAMESPACES IS NOT SUPPORTED IN SNOWFLAKE ***/!!! XMLNAMESPACES ('uri' as ns1)
SELECT
ProductID AS "ns1:ProductID",
Name AS "ns1:Name",
Color AS "ns1:Color"
FROM
Product
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0044 - FOR XML RAW CLAUSE IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
FOR XML RAW;
Para obter suporte adicional, entre em contato conosco pelo e-mail snowconvert-support@snowflake.com
EWI relacionado¶
SSC-PRF-TS0001: Aviso de desempenho - O código contém uma expressão de tabela comum (CTE) que pode ser recursiva. Verifique se você precisa adicionar a palavra-chave “RECURSIVE”.
SSC-EWI-TS0044: A cláusula “FOR XML” não pode ser usada no Snowflake, pois não é compatível.
SSC-FDM-TS0015: Observe que a função Regexp_Substr no Snowflake só funciona com expressões regulares POSIX.
SSC-EWI-TS0077¶
Gravidade¶
Low
Descrição¶
Esse erro aparece quando você usa uma cláusula de agrupamento que o Snowflake não suporta.
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 de saída:¶
SELECT 'a'
-- !!!RESOLVE EWI!!! /*** SSC-EWI-TS0077 - COLLATION Albanian_BIN NOT SUPPORTED ***/!!!
-- COLLATE Albanian_BIN
;
SELECT 'a'
-- !!!RESOLVE EWI!!! /*** SSC-EWI-TS0077 - COLLATION Albanian_CI_AI NOT SUPPORTED ***/!!!
-- COLLATE Albanian_CI_AI
;
CREATE OR REPLACE TABLE ExampleTable (
ID INT,
Name VARCHAR(50)
-- !!!RESOLVE EWI!!! /*** SSC-EWI-TS0077 - COLLATION collateName NOT SUPPORTED ***/!!!
-- COLLATE collateName
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"transact"}}'
;
Recomendações¶
Não é necessária nenhuma ação da sua parte.
Para obter suporte adicional, entre em contato conosco pelo e-mail snowconvert-support@snowflake.com
SSC-EWI-TS0026¶
Gravidade¶
Low
Descrição¶
Esse aviso aparece quando uma expressão de tabela comum (CTE) contendo uma instrução DELETE FROM é convertida em uma instrução CREATE OR REPLACE TABLE.
Exemplo de código¶
Código de entrada:¶
WITH Duplicated AS (
SELECT *, ROW_NUMBER() OVER (PARTITION BY ID ORDER BY ID) AS RN
FROM WithQueryTest
)
DELETE FROM Duplicated
WHERE Duplicated.RN > 1
Código de saída:¶
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0026 - WITH DELETE QUERY TURNED TO CREATE TABLE ***/!!!
CREATE OR REPLACE TABLE WithQueryTest AS
SELECT
*
FROM
WithQueryTest
QUALIFY
ROW_NUMBER()
OVER (PARTITION BY
ID
ORDER BY ID) = 1;
Recomendações¶
Não é necessária nenhuma ação da sua parte.
Para obter suporte adicional, entre em contato conosco pelo e-mail snowconvert-support@snowflake.com