SnowConvert AI - Problemas do SQL Server-Azure Synapse

Applies to
  • SQL Server

  • Azure Synapse Analytics

  • Sybase

SSC-EWI-TS0001

Corpo de função definida pelo usuário não gerado

Gravidade

Crítico

Nota

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

Descrição

Este EWI aparece quando o SnowConvert AI trata de uma exceção crítica que faz com que o corpo da função não seja gerado durante sua tradução.

Exemplo de código

SQL Server
 CREATE FUNCTION func1 ()
RETURNS VARCHAR
SELECT
   *
FROM
   TABLE1
Snowflake
 --** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "TABLE1" **
CREATE OR REPLACE FUNCTION func1 ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "transact",  "convertedOn": "07/14/2025",  "domain": "no-domain-provided" }}'
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0001 - THE BODY WAS NOT GENERATED FOR FUNCTION 'func1' ***/!!!
AS
$$

$$;

Práticas recomendadas

SSC-EWI-TS0002

O ANSI_PADDING OFF não é compatível com o Snowflake.

Gravidade

Low

Nota

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

Descrição

No Transact-SQL, a instrução SET ANSI_PADDING OFF remove os espaços finais na inserção de tipos de dados char. Visto que SET ANSI_PADDING OFF não é uma configuração diretamente configurável no Snowflake, o SnowConvert AI vai gerar este EWI.

Exemplo de código

SQL Server
 SET ANSI_PADDING OFF;
Snowflake
 !!!RESOLVE EWI!!! /*** SSC-EWI-TS0002 - THE ANSI_PADDING OFF IS NOT SUPPORTED IN SNOWFLAKE. ***/!!!
SET ANSI_PADDING OFF;

Práticas recomendadas

  • Adicione RTRIM a todas as inserções de tipo de dados CHAR() para remover este problema, incluindo o código ETL.

  • Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com

SSC-EWI-TS0003

O ANSI_WARNINGS OFF não é compatível com o Snowflake.

Gravidade

Low

Nota

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

Descrição

No Transact-SQL, a instrução SET ANSI_WARNINGS OFF desabilita avisos como divisão por zero ou estouro aritmético. Visto que SET ANSI_WARNINGS OFF não é uma configuração diretamente configurável no Snowflake, o SnowConvert AI vai gerar este EWI.

Exemplo de código

SQL Server
 SET ANSI_WARNINGS OFF;
Snowflake
 !!!RESOLVE EWI!!! /*** SSC-EWI-TS0003 - THE ANSI_WARNINGS OFF IS NOT SUPPORTED IN SNOWFLAKE. ***/!!!
SET ANSI_WARNINGS OFF;

Práticas recomendadas

SSC-EWI-TS0009

A seguinte transação pode conter transações aninhadas, o que é considerado um padrão complexo incompatível com o Snowflake.

Nota

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

Gravidade

High

Descrição

Este erro é adicionado para indicar quando uma transação pode conter transações aninhadas. No SQL Server, as transações podem ser aninhadas. Isto significa que é possível iniciar uma nova transação dentro de uma transação existente. Se após a primeira instrução BEGIN executarmos outra, uma nova transação será aberta e a contagem da transação atual será aumentada em um.\

Por outro lado, isto não é compatível com o Snowflake; o que acontecerá é que a segunda instrução BEGIN será ignorada e ainda haverá apenas uma transação. Para obter mais informações, 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 gerado:
 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. **
--END
   ;

Práticas recomendadas

  • No Snowflake, as transações aninhadas não causarão erros de compilação; elas serão simplesmente ignoradas. Você pode acessar os relatórios de avaliação para verificar se as transações aninhadas estão presentes.

  • Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com

SSC-EWI-TS0010

A expressão de tabela comum na exibição não é compatível com o Snowflake.

Nota

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

Gravidade

High

Descrição

Este erro é adicionado quando um CTE inválido está dentro de uma exibição, já que exibições são representações materializadas de consultas, o que significa que elas definem apenas como os dados são recuperados e apresentados, não como são manipulados.

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 gerado:
 !!!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
));

EWI relacionado

  1. SSC-EWI-0021: Sem suporte.

Práticas recomendadas

SSC-EWI-TS0013

Coluna computada transformada

Nota

Este EWI está obsoleto, consulte a documentação SSC-FDM-TS0013

Gravidade

Low

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-EWI-TS0015

O tipo de dados não é compatível com o Snowflake

Gravidade

Medium

Descrição

Este aviso é adicionado quando um SQL A coluna do servidor tem um tipo incompatível com o Snowflake.

Exemplo de código

Código de entrada:
 CREATE TABLE table1
(
    column1 customType,
);
Código gerado:
 CREATE OR REPLACE TABLE table1
(
    column1 VARIANT !!!RESOLVE EWI!!! /*** SSC-EWI-TS0015 - DATA TYPE CUSTOMTYPE IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"transact"}}'
;

Práticas recomendadas

SSC-EWI-TS0016

Tradutor da função escalar ODBC pendente

Nota

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

Descrição

Este EWI é adicionado quando o SnowConvert AI encontra uma função escalar ODBC dentro do código de entrada.\ As funções definidas pelo usuário são incompatíveis com a função escalar ODBC.

Exemplo de código

Código de entrada:
 SELECT {fn CURRENT_DATE_UDF()};
Código gerado:
 --** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "CURRENT_DATE_UDF" **
SELECT
CURRENT_DATE_UDF() !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'CURRENT_DATE_UDF' NODE ***/!!!!!!RESOLVE EWI!!! /*** SSC-EWI-TS0016 - USER DEFINED FUNCTIONS ARE NOT SUPPORTED IN ODBC SCALAR FUNCTION. ***/!!!;

EWI relacionado

  1. SSC-EWI-0073: Revisão de equivalência funcional pendente.

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-EWI-TS0017

O mascaramento é incompatível

Gravidade

Low

Descrição

Este EWI é adicionado quando o SnowConvert AI encontra uma coluna mascarada dentro de uma instrução CREATE TABLE. Esta funcionalidade não funciona adicionando a opção à declaração da coluna. É necessário um esforço manual para ter o mesmo comportamento que o SQL Server.

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 gerado:
 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"}}'
;

Práticas recomendadas

O SnowConvert AI não está gerando MASKING POLICIES na versão atual, portanto, elas têm que ser criadas manualmente. Por exemplo,

a primeira etapa é criar uma função de administrador de política de mascaramento.

 create role masking_admin;

A segunda é conceder os privilégios necessários à função 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;

A próxima etapa é criar as funções de política de mascaramento.

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

Nota

Para fins de amostra, usamos alguns exemplos de funções de mascaramento em SQL Server e as traduzimos manualmente para seu equivalente em Snowflake.

A etapa final é adicionar a política de mascaramento à coluna que originalmente tinha a opção de mascaramento em 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 mais suporte, envie um e-mail para snowconvert-support@snowflake.com

SSC-EWI-TS0023

Opção em massa incompatível

Gravidade

Low

Nota

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

Descrição

Este EWI é adicionado quando não foi possível mapear alguma opção em um BULKINSERT. As opções em massa traduzidas devem ser refletidas como opções FILE FORMAT.

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 gerado:
 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;

Práticas recomendadas

EWI relacionado

  1. SSC-FDM-TS0004: PUT instrução incompatível na UI.

SSC-EWI-TS0024

Transformação incompleta para inserção em massa

Gravidade

Low

Descrição

Este EWI é adicionado quando um BULK INSERT dentro de um procedimento armazenado não foi identificado, de modo que as dependências para a transformação completa não sejam geradas. Também o COPY INTO transformado recupera o arquivo de um tempStage que precisa ser criado manualmente.

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 gerado:
 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 AI Helpers Code
   // END REGION

   EXEC(`COPY INTO dbo.table1 FROM @STAGE_638461207064166040/test.txt`);
$$

Práticas recomendadas

SSC-EWI-TS0025

Função ERROR_SEVERITY transformada

Gravidade

Low

Nota

Generate Procedures and Macros using JavaScript as the target language adding the following flag -t JavaScript or –PLTargetLanguage JavaScript

Nota

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

Descrição

Este EWI é adicionado quando a função interna ERROR_SEVERITY está traduzida. Por padrão, a função retornará 16, pois é a gravidade mais comum no SQL Server. O UDF gerado deve recuperar

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 gerado:
 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 AI 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()`);
    }
$$;

Práticas recomendadas

SSC-EWI-TS0026

com Delete Query transformada em Create Table.

Gravidade

Low

Descrição

Este EWI é adicionado quando uma expressão de tabela comum com uma Delete From é transformada em Create ou 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 gerado:
 !!!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;

Práticas recomendadas

SSC-EWI-TS0032

Inserção em massa parcialmente traduzida

Aviso

O EWI só é gerado quando o Javascript é a linguagem de destino para procedimentos armazenados. Este recurso de tradução está obsoleto, pois o Script Snowflake é a linguagem de destino recomendada para procedimentos armazenados.

Gravidade

High

Nota

Generate Procedures and Macros using JavaScript as the target language adding the following flag -t JavaScript or –PLTargetLanguage JavaScript

Nota

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

Descrição

Este EWI é adicionado a um literal que era originalmente uma concatenação, quando o código contido tinha uma instrução BULK INSERT. O comando PUT resultante da tradução de BULK INSERT é incompatível na execução do código que era originalmente SQL Dynamic.

Por esta razão, o comando PUT deve ser extraído do código de saída e executado manualmente fora do procedimento que o contém. Tenha em mente que se houver muitas instruções BULK INSERT em sentenças de Dynamic SQL dentro do procedimento, é aconselhável dividir este procedimento para poder executar manualmente o comando PUT correspondente para cada BULK INSERT traduzido.

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 gerado:
 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 AI Helpers Code section is omitted.

    /*** SSC-EWI-0040 - THE 'SET' CLAUSE 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_638923328992788100;

CREATE OR REPLACE STAGE STAGE_638923328992788100
FILE_FORMAT = FILE_FORMAT_638923328992788100;

PUT file://${IMPORTNAME} @STAGE_638923328992788100 AUTO_COMPRESS = FALSE;

COPY INTO ${SOURCEAFFILIATES}
FROM @STAGE_638923328992788100/${IMPORTNAME}`;
    EXEC(`${SQLSTRING}`);
$$;

Práticas recomendadas

  • Extraia o comando PUT resultante da instrução Dynamic BULK INSERT e execute-a antes de chamar o procedimento.

  • Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com

SSC-EWI-TS0034

Cláusula RETURNS incompleta devido à falta de símbolos

Gravidade

High

Descrição

Este EWI é adicionado ao código de saída quando a cláusula RETURNS TABLE de um CREATE FUNCTION não poderia ser gerada corretamente. Isso acontece quando as colunas que devem ser especificadas na cláusula RETURNS TABLE resultante não pode ser inferida por SnowConvert AI, deixando a cláusula RETURNS TABLE vazia.

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 gerado:
 --** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "HumanResources.Department" **
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": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "transact",  "convertedOn": "07/14/2025",  "domain": "no-domain-provided" }}'
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
$$;

--** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "GetDepartmentInfo" **

SELECT
    *
FROM
    TABLE(GetDepartmentInfo());

Práticas recomendadas

  • As causas para esse problema podem variar. Certifique-se de incluir todos os objetos de que seu código precisa. Se o problema persistir, mesmo que a migração tenha acesso a todos os objetos necessários, entre em contato conosco com informações sobre seu cenário específico.

  • Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com

SSC-EWI-TS0035

Declarar uma variável de cursor que nunca é inicializada é incompatível.

Gravidade

Medium

Nota

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

Descrição

Currently, a Cursor Variable that is declared but never initialized is not supported by Snowflake. Thus, the EWI is added, and the code commented out.

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 gerado:
 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;
$$;

Práticas recomendadas

SSC-EWI-TS0036

O Script Snowflake só é compatível com cursores locais.

Gravidade

Medium

Nota

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

Descrição

Este EWI é adicionado quando são identificados outros cursores que não sejam cursores locais. Atualmente, o Script Snowflake só é compatível com cursores locais. Assim, todos os cursores são traduzidos como cursores locais.

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;
$$;
 

Práticas recomendadas

SSC-EWI-TS0037

Os cursores do Script Snowflake não são roláveis.

Gravidade

Medium

Nota

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

Descrição

Os cursores do Script Snowflake não são roláveis. Atualmente, somente FETCH NEXT é compatível.

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 gerado:
 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;
$$;

Práticas recomendadas

SSC-EWI-TS0039

Várias instruções SET encontradas para o mesmo cursor.

Gravidade

Medium

Descrição

Este EWI é adicionado quando várias instruções SET são encontradas para o mesmo cursor. Todas as instruções SET adicionais também são transformadas em comentário. Isso acontece porque ter várias instruções SET para o mesmo cursor não é válida no Script Snowflake.

Exemplo de código:

Este EWI é adicionado quando várias instruções SET são encontradas para o mesmo cursor. Todas as instruções SET adicionais também são transformadas em comentário. Isso acontece porque ter várias instruções SET para o mesmo cursor não é válida no Script Snowflake.

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 gerado:
 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
		 
		 
		 
		 
		 
		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 'SET CURSOR' CLAUSE 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 'SET CURSOR' CLAUSE 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;
$$;

Práticas recomendadas

SSC-EWI-TS0041

Os métodos de tipo de dados XML são incompatíveis com o Snowflake.

Gravidade

Medium

Descrição

Este EWI é adicionado aos seguintes métodos de tipo de dados XML que são incompatíveis com o Snowflake SQL:

  • Valor

  • Consulta

  • Existir

  • Modificar

  • Nós

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 gerado:
 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;
$$;

Práticas recomendadas

SSC-EWI-TS0043

WITH XMLNAMESPACES não é compatível com o Snowflake.

Gravidade

Medium

Nota

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

Descrição

Este EWI é adicionado à cláusula WITH XMLNAMESPACES , que não é compatível com o 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 gerado:
 --** 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 !!!RESOLVE EWI!!! /*** SSC-EWI-TS0015 - DATA TYPE NS1 IS NOT SUPPORTED IN SNOWFLAKE ***/!!! NOT NULL)
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;

Práticas recomendadas

  • Considere o uso de UDFs para emular o comportamento do código-fonte. O código a seguir fornece sugestões de UDFs que podem ser usados para conseguir recriar o comportamento original:

SQL Server
 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
Snowflake SQL
 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;

EWI relacionado

  1. SSC-PRF-TS0001: Aviso de desempenho - recursão de CTE não verificada. Pode exigir uma palavra-chave recursiva.

  2. A cláusula SSC-EWI-TS0044: FOR XML não é compatível com o Snowflake.

  3. SSC-EWI-TS0015: Tipo de dados incompatíveis com o Snowflake

SSC-EWI-TS0044

A cláusula FOR XML não é compatível com o Snowflake.

Gravidade

Crítico

Nota

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

Descrição

Este EWI é adicionado à cláusula FOR XML , que não é compatível com o Snowflake SQL

Exemplo de código

Código de entrada:
 SELECT TOP 1 LastName
FROM AdventureWorks2019.Person.Person
FOR XML AUTO;
Código gerado:
 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;

Práticas recomendadas

  • Considere o uso de UDFs para emular o comportamento do código-fonte. O código a seguir fornece sugestões de UDFs que podem ser usados para conseguir recriar o comportamento original:

SQL Server

Consulta
 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
Resultado
 -- 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
Consulta
 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;
Resultado
 -- 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"  />

SSC-EWI-TS0045

A instrução rotulada não é compatível com o Script Snowflake.

Gravidade

Low

Nota

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

Descrição

Este EWI é adicionado a todos os LABELS usados com a instrução 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 gerado:
 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;
$$;

Práticas recomendadas

EWI relacionado

  1. SSC-EWI-0073: Revisão de equivalência funcional pendente.

SSC-EWI-TS0046

A tabela do sistema não é compatível com o Snowflake.

Gravidade

Medium

Descrição

This EWI is added when referencing SQL Server system tables not supported or without equivalent in Snowflake SQL. See the supported and unsupported system tables reference for the complete list.

Exemplo de código

Código de entrada:
 SELECT *
FROM 
    sys.all_sql_modules
WHERE 
    [STATE] = 0; -- state must be ONLINE
Código gerado:
 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

Práticas recomendadas

SSC-EWI-TS0047

A mensagem de erro RAISERROR pode ser diferente devido ao formato da cadeia de caracteres do SQL Server.

Nota

Este EWI está obsoleto, consulte a documentação SSC-FDM-TS0019

Gravidade

Low

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
		!!!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;
$$;

Práticas recomendadas

SSC-EWI-TS0049

A tradução de várias linhas do corpo If planejada para ser entregue no futuro.

Nota

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

Gravidade

Medium

Descrição

A maioria dos casos em instruções IF contendo um Begin ... Bloco End dentro de seu corpo é compatível. Este é um cenário bem-sucedido (nenhum SSC-EWI-TS0049 gerado).

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 gerado:
 !!!RESOLVE EWI!!! /*** SSC-EWI-0068 - USER DEFINED FUNCTION WAS TRANSFORMED TO SNOWFLAKE PROCEDURE ***/!!!
--** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "TABLE1" **
CREATE OR REPLACE PROCEDURE PURCHASING.FOO (STATUS INT)
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "transact",  "convertedOn": "07/14/2025",  "domain": "no-domain-provided" }}'
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;
$$;

Nota

Em um exemplo de código geral (como o na parte superior), a conversão é feita com sucesso. Mas há alguns casos extremos em que a instrução «IF» não é convertida e o EWI será gerado.

Suporte manual

Caso 1: Instrução única

Para esses casos, a transformação seria simples, pois a instrução transformada apareceria em uma cláusula de seleção

 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

Para casos em que várias instruções estão sendo transformadas, deve-se transformar a instrução N, e usá-la como a tabela de origem para a 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

Para estes casos, será necessário replicar uma transformação para cada instrução definida.

 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) 
...

Práticas recomendadas

SSC-EWI-TS0055

A restrição padrão foi transformada em comentário e pode ter sido adicionada a uma definição de tabela.

Nota

Este EWI está obsoleto, consulte a documentação SSC-FDM-TS0020.

Gravidade

Medium

Descrição

Este EWI é adicionado quando a restrição padrão está presente em uma instrução Alter table.

Atualmente, essa restrição é incompatível. Uma solução alternativa disponível para transformá-la é quando a tabela é previamente definida como Alter Table, desta forma identificamos as referências, e a restrição padrão é unificada na definição da tabela; caso contrário, a restrição é apenas transformada em comentário.

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 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,
  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;

Nota

Se todo o conteúdo de Alter Table for inválido, ela será transformada em comentário.

Problemas conhecidos

Quando diferentes restrições padrão são declaradas na mesma coluna, apenas a primeira é refletida na instrução Create Table.

Práticas recomendadas

SSC-EWI-TS0056

Um MASKING POLICY foi criado como um substituto para MASKED WITH.

Nota

Este EWI está obsoleto, consulte a documentação SSC-FDM-TS0021.

Gravidade

Low

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 um 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:
 !!!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";

Nota

MASKING POLICY será criada 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. <!– TODO: You can relate to Broken link broken-reference «mention» for further details.>

Práticas recomendadas

SSC-EWI-TS0057

O usuário deve previamente definir a função de mascaramento.

Nota

Este EWI está obsoleto, consulte a documentação SSC-FDM-TS0022

Gravidade

Low

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:
 !!!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";

Nota

As shown on line 6, there is a placeholder where the defined roles can be placed. There is room for one or several values separated by commas. Also, here, the use of single quotes is mandatory for each of the values.

Práticas recomendadas

SSC-EWI-TS0060

Intervalo de data e hora incompatível no Snowflake.

Gravidade

Medium

Descrição

Este EWI é adicionado quando uma das seguintes partes de tempo é usado como parâmetro para uma função relacionada à data, pois não são compatíveis com o Snowflake. Para mais informações, vá para «Partes de data e hora com suporte» (Funções de data e hora | Documentação do Snowflake).

Exemplo de código

Código de entrada
 SELECT
    -- Supported
    DATEPART(second, getdate()),
    -- Not supported
    DATEPART(millisecond, getdate()),
    DATEPART(microsecond, getdate());
Código gerado:
 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);

Práticas recomendadas

  • Um UDF poderia ser criado para extrair manualmente partes de tempo incompatíveis com o Snowflake.

  • Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com

SSC-EWI-TS0061

ALTER COLUMN incompatível

Gravidade

Medium

Nota

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

Descrição

Este EWI é adicionado sempre que há uma instrução ALTER COLUMN incompatível

Exemplo de código

Código de entrada:
 ALTER TABLE SampleTable
ALTER COLUMN SampleColumn INT NULL SPARSE;
Código gerado:
 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;

Práticas recomendadas

SSC-EWI-TS0063

Fuso horário incompatível com o Snowflake.

Gravidade

Crítico

Descrição

Este EWI é adicionado quando há fusos horários incompatí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 gerado:
 SELECT
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0063 - TIME ZONE NOT SUPPORTED IN SNOWFLAKE ***/!!!
CURRENT_TIMESTAMP() at time zone 'Turks And Caicos Standard Time'
                                                                 ;

Práticas recomendadas

  • Uma função definida pelo usuário pode ser criada para dar compatibilidade a vários fusos horários.

  • Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com

SSC-EWI-TS0067

Parâmetros inválidos na função com valor de tabela OPENXML.

Gravidade

Crítico

Nota

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

Descrição

Este EWI é adicionado quando há parâmetros inválidos na OPENXML, especificamente quando não é possível acessar o caminho XML.

Para evitar este EWI, envie o caminho explícito do nó por meio dos parâmetros.

Código de entrada:
 SELECT
    *
FROM
    OPENXML (@idoc, @path, 1) WITH (
        CustomerID VARCHAR(10),
        ContactName VARCHAR(20)
    );
Código gerado:
 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 gerado (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');

Práticas recomendadas

SSC-EWI-TS0070

CURRENT_TIMESTAMP na instrução At Time Zone pode ter um comportamento diferente em certos casos.

Nota

Este EWI está obsoleto, consulte a documentação SSC-FDM-TS0024.

Descrição

Este EWI é adicionado quando At Time Zone tem o CURRENT_TIMESTAMP. Isso ocorre porque o resultado pode ter resultados diferentes em alguns casos.

A principal diferença é que no SQL Server, CURRENT_TIMESTAMP retorna a data e hora atual do sistema no fuso horário do servidor e, no Snowflake, CURRENT_TIMESTAMP retorna a data e hora atual no fuso horário UTC (Horário Universal Coordenado).

Código de entrada:

SQL Server
 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() !!!RESOLVE EWI!!! /*** SSC-EWI-TS0070 - 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 se você quiser 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

SSC-EWI-TS0072

A instrução RETURN será ignorada devido à instrução RETURN anterior

Gravidade

Baixo

Nota

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

Descrição

Este EWI é adicionado quando as instruções SELECT e os parâmetros OUPUT devem ser retornados. Nesse caso, os conjuntos de resultados das instruções SELECT são priorizadas.

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 gerado:
--** SSC-FDM-0007 - MISSING DEPENDENT OBJECTS "AdventureWorks.HumanResources.Department", "AdventureWorks.HumanResources.Employee" **
CREATE OR REPLACE PROCEDURE SOMEPROC (PRODUCT_COUNT OUT INT, _123 OUT INT)
RETURNS ARRAY
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "transact",  "convertedOn": "07/16/2025",  "domain": "no-domain-provided" }}'
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;
	END;
$$;

Práticas recomendadas

EWI relacionado

  1. SSC-FDM-0020: Vários conjuntos de resultados são retornados em tabelas temporárias;

SSC-EWI-TS0073

A mensagem de erro poderia ser diferente no Snowflake

Nota

Este EWI está obsoleto, consulte a documentação SSC-FDM-TS0023

Gravidade

Low

Descrição

Este EWI é adicionado na transformação de ERROR_MESSAGE(). A mensagem exata do erro poderia mudar no Snowflake.

Código de entrada:
 SET @varErrorMessage = ERROR_MESSAGE()
Código gerado
 BEGIN
VARERRORMESSAGE := SQLERRM !!!RESOLVE EWI!!! /*** SSC-EWI-TS0073 - ERROR MESSAGE COULD BE DIFFERENT IN SNOWFLAKE ***/!!!;
END;

Recomendação

Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com.

SSC-EWI-TS0074

O resultado da conversão pode ser diferente da função TRY_CAST/TRY_CONVERT devido à falta de dependências

Gravidade

Low

Nota

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

Descrição

Este EWI é adicionado na transformação das funções TRY_CAST e TRY_CONVERT. O resultado exato dessas funções pode mudar no Snowflake devido à falta de dependências (o SnowConvert AI não conseguiu resolver alguns tipos de dados). Isto poderia ocorrer porque a dependência não estava 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 gerado
 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 mais suporte, envie um e-mail para snowconvert-support@snowflake.com.

SSC-EWI-TS0075

Procedimento interna incompatível

Gravidade

Medium

Descrição

A tradução de procedimentos internos é incompatível atualmente.

Exemplo de código

Código de entrada:
 EXEC sp_column_privileges_rowset_rmt 'Caption';
Código gerado:
 !!!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';

Práticas recomendadas

SSC-EWI-TS0076

Os parâmetros padrão podem precisar ser reordenados

Nota

This EWI is deprecated. SnowConvert AI now automatically reorders default parameters to the end of the parameter list. Please refer to SSC-FDM-0041 for the updated behavior.

Gravidade

Medium

Descrição

Os parâmetros padrão podem precisar ser reordenados. O Snowflake só é compatível com parâmetros padrão no final das declarações 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 gerado:
 !!!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;
$$;

Práticas recomendadas

SSC-EWI-TS0077

Agrupamento incompatível

Gravidade

Low

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'
--           !!!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"}}'
;

Práticas recomendadas

SSC-EWI-TS0078

Valor padrão não permitido no Snowflake.

Gravidade

Medium

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
                         !!!RESOLVE EWI!!! /*** SSC-EWI-TS0078 - DEFAULT OPTION NOT ALLOWED IN SNOWFLAKE ***/!!!
                         DEFAULT RANDOM(10);

Práticas recomendadas

SSC-EWI-TS0079

Comando incompatível do console do banco de dados

Gravidade

Medium

Descrição

Este EWI é adicionado quando o SnowConvert AI encontra uma instrução DBCC dentro do código de entrada.\ A maioria das instruções DBCC é incompatível com o Snowflake.

Exemplo de código

Código de entrada:
 DBCC CHECKIDENT(@a, RESEED, @b) WITH NO_INFOMSGS
Código gerado:
 !!!RESOLVE EWI!!! /*** SSC-EWI-TS0079 - 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-EWI-TS0080

A alteração do contexto de execução em tempo de execução é incompatível com o Snowflake

Gravidade

High

Descrição

Usuários do SQL Server pode usar o comando EXECUTE AS para mudar temporariamente o contexto de execução, isso modifica os privilégios de execução e afeta os resultados de funções dependentes de contexto, como USER_NAME(). O comando REVERT pode ser usado para restaurar o contexto anterior à última EXECUTE AS.

O Snowflake só é compatível com a definição de um contexto de execução em procedimentos, usando as instruções CREATE PROCEDURE ou ALTER PROCEDURE. A alteração do contexto em tempo de execução é incompatível.

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;
$$;

Práticas recomendadas

SSC-EWI-TS0081

O uso de uma junção completa em uma instrução de exclusão é incompatível

Descrição

Ao transformar a instrução DELETE, o SnowConvert AI extrai as referências de tabela encontradas na cláusula FROM da instrução e as move para a cláusula USING da instrução de exclusão do Snowflake.

The following EWI warns the user about the limitations of the outer join (+) syntax in Snowflake. To preserve the LEFT and RIGHT JOINs used in the original code, outer join syntax (+) is added to the conditions to indicate such behavior. However, in Snowflake, the (+) syntax can’t be used to indicate FULL JOINs. For more information, see Joins in the WHERE clause.

Código de exemplo

Código de entrada:
DELETE Employees
FROM Employees FULL OUTER JOIN Departments
ON Employees.DepartmentID = Departments.DepartmentID
WHERE Departments.DepartmentID IS NULL;
Código gerado:
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0081 - USING A FULL JOIN IN A DELETE STATEMENT IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
DELETE FROM
Employees
USING Departments
WHERE
Departments.DepartmentID IS NULL
AND Employees.DepartmentID = Departments.DepartmentID;

Práticas recomendadas

  • Verifique a lógica de seu FULL JOIN, pode ser possível reescrevê-lo como outro tipo de JOIN. Por exemplo, o código incluído no código de exemplo é essencialmente o mesmo que um LEFT JOIN:

Entrada:

DELETE Employees
FROM Employees LEFT OUTER JOIN Departments
ON Employees.DepartmentID = Departments.DepartmentID
WHERE Departments.DepartmentID IS NULL;

Saída:

 DELETE FROM
    Employees
USING Departments
WHERE
    Departments.DepartmentID IS NULL
    AND Employees.DepartmentID = Departments.DepartmentID(+);

SSC-EWI-TS0082

CROSS APPLY foi convertido em LEFT OUTER JOIN e requer validação manual.

Descrição

A validação manual é necessária porque a conversão de CROSS APPLY em LEFT OUTER JOIN pode levar a resultados incorretos ou comportamentos inesperados no Snowflake. Embora as duas funções possam parecer semelhantes, elas tratam certas situações de forma diferente, especialmente quando a subconsulta não tem correspondências ou a subconsulta está correlacionada com a tabela externa.

Código de exemplo

Dados de configuração
-- Create a table to store monthly sales or metric data
CREATE TABLE sales_metrics (
    metric_id INT PRIMARY KEY,
    january_value VARCHAR(35),
    february_value VARCHAR(35),
    march_value VARCHAR(35)
);

-- Insert sample data
INSERT INTO sales_metrics (metric_id, january_value, february_value, march_value) VALUES
(1, 'sales-jan-1', 'sales-feb-1', 'sales-march-1'),
(2, 'sales-jan-2', 'sales-feb-2', 'sales-march-2');
Código de entrada:
SELECT
    m.metric_id,
    monthly_data.metric_value,
    monthly_data.month_number
FROM
    sales_metrics m
CROSS APPLY (
    SELECT m.january_value AS metric_value, '01' AS month_number
    UNION ALL
    SELECT m.february_value AS metric_value, '02' AS month_number
    UNION ALL
    SELECT m.march_value AS metric_value, '03' AS month_number
) AS monthly_data;
Código gerado:
SELECT
    m.metric_id,
    monthly_data.metric_value,
    monthly_data.month_number
FROM
    sales_metrics m
    !!!RESOLVE EWI!!! /*** SSC-EWI-TS0082 - CROSS APPLY HAS BEEN CONVERTED TO LEFT OUTER JOIN AND REQUIRES MANUAL VALIDATION. ***/!!!
    LEFT OUTER JOIN
        (
               SELECT
                m.january_value AS metric_value, '01' AS month_number
               UNION ALL
               SELECT
                m.february_value AS metric_value, '02' AS month_number
               UNION ALL
               SELECT
                m.march_value AS metric_value, '03' AS month_number
           ) AS monthly_data;

Práticas recomendadas

Principais cenários em que LEFT OUTER JOIN Pode falhar

  • Comportamento de filtragem: se o CROSS APPLY original destinava-se a filtrar as linhas da tabela principal que não tinham correspondências na subconsulta, um LEFT OUTER JOIN não replicará este comportamento. Em vez disso, incluirá essas linhas com valores NULL para as colunas unidas, o que pode não ser o resultado pretendido.

  • Subconsultas correlacionadas: CROSS APPLY foi projetado especificamente para dar compatibilidade a subconsultas correlacionadas, em que a subconsulta faz referência a colunas da consulta externa. Uma LEFT OUTER JOIN padrão não é compatível com esse padrão da mesma maneira. A tentativa de converter um CROSS APPLY correlacionado em uma LEFT OUTER JOIN pode levar a erros de sintaxe, produtos cartesianos (linhas duplicadas) ou resultados logicamente incorretos.

  • Diferenças do conjunto de resultados: a semântica de CROSS APPLY e LEFT OUTER JOIN diferem, especialmente quando a subconsulta não retorna nenhuma linha. CROSS APPLY excluirá tais linhas do resultado, enquanto LEFT OUTER JOIN irá incluí-las com valores NULL.

Recomendação: sempre revise e teste a saída das consultas em que CROSS APPLY foi convertido em LEFT OUTER JOIN para garantir a exatidão.

SSC-EWI-TS0083

Error Message

ROLLBACK TRANSACTION requires the appropriate setup to work as intended.

Gravidade

Low

Descrição

This EWI is generated when a ROLLBACK TRANSACTION statement is encountered, indicating that SnowConvert has successfully transformed the statement into a Snowflake-compatible format. However, the transformation requires manual verification because Snowflake’s transaction rollback behavior differs significantly from SQL Server’s ROLLBACK TRANSACTION functionality.

Exemplo de código

Input (SQL Server):

BEGIN TRANSACTION MyTransaction;

    -- Some operations
    INSERT INTO Employees (Name, Department) VALUES ('Alice', 'Engineering');

    IF @@ERROR <> 0
    BEGIN
        ROLLBACK TRANSACTION MyTransaction;  -- Named transaction rollback
    END
    ELSE
    BEGIN
        COMMIT TRANSACTION MyTransaction;
    END

Output (Snowflake Scripting):

BEGIN
    !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'BeginTransaction' NODE ***/!!!
    BEGIN TRANSACTION MyTransaction;

        -- Some operations
    --** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "Employees" **
        INSERT INTO Employees (Name, Department) VALUES ('Alice', 'Engineering');
    IF (:ERROR <> 0) THEN
        BEGIN
            !!!RESOLVE EWI!!! /*** SSC-EWI-TS0083 - ROLLBACK TRANSACTION REQUIRES THE APPROPRIATE SETUP TO WORK AS INTENDED. ***/!!!
            ROLLBACK TRANSACTION MyTransaction;  -- Named transaction rollback

        END;
    ELSE
        BEGIN
            COMMIT;
        END;
    END IF;
END;

SSC-EWI-TS0085

INSERT WITH EXECUTE statement requires manual review.

Gravidade

Medium

Descrição

This issue is generated when SnowConvert AI encounters an INSERT ... EXECUTE statement that cannot be automatically transformed. In SQL Server, INSERT ... EXEC inserts the result set of a stored procedure or dynamic SQL into a table. Snowflake does not support this syntax directly. When the statement appears at the top level (outside a stored procedure), SnowConvert AI cannot apply its standard transformation pattern and flags the statement for manual review.

Exemplo de código

Código de entrada:
INSERT INTO SalesReport
EXEC GenerateQuarterlySales @Quarter = 1;
Código gerado:
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0085 - INSERT WITH EXECUTE NODE NEEDS TO BE CHECKED. ***/!!!
INSERT INTO SalesReport EXEC GenerateQuarterlySales @Quarter = 1;

Práticas recomendadas

  • Rewrite the logic using Snowflake Scripting: call the procedure separately, capture its result with RESULT_SCAN(LAST_QUERY_ID()), and then INSERT INTO ... SELECT from the result set.

  • If the procedure returns a fixed schema, consider using a temporary table or TABLE() function to capture the output.

  • Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com

SSC-EWI-TS0086

OPENQUERY is not supported in Snowflake.

Gravidade

High

Descrição

This issue is generated when SnowConvert AI encounters an OPENQUERY function. In SQL Server, OPENQUERY executes a pass-through query on a linked server and returns the result as a table. Snowflake does not have an equivalent linked server or OPENQUERY mechanism. The statement is preserved as-is with an EWI marker for manual migration.

Exemplo de código

Código de entrada:
SELECT *
FROM OPENQUERY(OracleFinance, 'SELECT account_id, balance FROM accounts WHERE status = ''ACTIVE''');
Código gerado:
SELECT
    *
FROM
    !!!RESOLVE EWI!!! /*** SSC-EWI-TS0086 - OPENQUERY NODE NEEDS TO BE CHECKED. ***/!!! OPENQUERY (OracleFinance, 'SELECT account_id, balance FROM accounts WHERE status = ''ACTIVE''');

Práticas recomendadas

  • Replace OPENQUERY with Snowflake external tables, external stages, or data sharing to access data from external sources.

  • If the linked server points to another database, consider migrating that data into Snowflake or using Snowflake’s connector ecosystem (e.g., Snowflake Connector for Oracle).

  • For real-time access patterns, evaluate Snowflake External Network Access or External Functions.

  • Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com

SSC-EWI-TS0087

GOTO is not supported in Snowflake.

Gravidade

High

Descrição

This issue is generated when SnowConvert AI encounters a GOTO statement inside a stored procedure. SQL Server supports GOTO for unconditional jumps to labeled statements within a procedure. Snowflake Scripting does not support GOTO or labeled jump targets. The GOTO statement is preserved with an EWI marker, and the associated labels also receive a separate EWI (SSC-EWI-TS0045).

Exemplo de código

Código de entrada:
CREATE PROCEDURE ValidateScore
AS
BEGIN
    DECLARE @Score INT
    SET @Score = 49
    IF @Score >= 50
        GOTO Pass
    IF @Score < 50
        GOTO Fail
    Pass:
        SELECT 'Passed' AS Result;
        RETURN 1;
    Fail:
        SELECT 'Failed' AS Result;
        RETURN 0;
END
Código gerado:
CREATE OR REPLACE PROCEDURE ValidateScore ()
RETURNS VARCHAR
LANGUAGE SQL
EXECUTE AS CALLER
AS
$$
    DECLARE
        SCORE INT;
    BEGIN
        SCORE := 49;
        IF (:SCORE >= 50) THEN
            !!!RESOLVE EWI!!! /*** SSC-EWI-TS0087 - GOTO IS NOT SUPPORTED IN SNOWFLAKE. ***/!!!
            GOTO Pass
        END IF;
        IF (:SCORE < 50) THEN
            !!!RESOLVE EWI!!! /*** SSC-EWI-TS0087 - GOTO IS NOT SUPPORTED IN SNOWFLAKE. ***/!!!
            GOTO Fail
        END IF;
        !!!RESOLVE EWI!!! /*** SSC-EWI-TS0045 - LABELED STATEMENT IS NOT SUPPORTED IN SNOWFLAKE SCRIPTING ***/!!!
        Pass:
        SELECT 'Passed' AS Result;
        RETURN 1;
        !!!RESOLVE EWI!!! /*** SSC-EWI-TS0045 - LABELED STATEMENT IS NOT SUPPORTED IN SNOWFLAKE SCRIPTING ***/!!!
        Fail:
        SELECT 'Failed' AS Result;
        RETURN 0;
    END;
$$;

Práticas recomendadas

  • Refactor GOTO-based control flow into structured constructs such as IF/ELSE, CASE, LOOP, or by splitting the procedure into smaller procedures.

  • For simple pass/fail patterns like the example above, replace the GOTO logic with an IF/ELSEIF/ELSE block.

  • Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com

SSC-EWI-TS0088

Unsupported sequence options were removed during conversion.

Gravidade

Low

Descrição

This issue is generated when SnowConvert AI encounters a CREATE SEQUENCE statement with options that are not supported in Snowflake, such as MINVALUE, MAXVALUE, or CYCLE. These options are removed during conversion because Snowflake sequences only support START WITH and INCREMENT BY. The EWI message lists the specific options that were removed.

Exemplo de código

Código de entrada:
CREATE SEQUENCE InvoiceNumberSeq
START WITH 1000
INCREMENT BY 5
MINVALUE 100
MAXVALUE 50000
CYCLE;
Código gerado:
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0088 - SEQUENCE OPTIONS 'MIN VALUE, MAX VALUE, CYCLE' WERE REMOVED, THEY ARE NOT SUPPORTED IN SNOWFLAKE ***/!!!
CREATE SEQUENCE InvoiceNumberSeq
  START WITH 1000
  INCREMENT BY 5
;

Práticas recomendadas

  • If your application relies on CYCLE behavior, implement a wrapper UDF that resets the sequence value when it exceeds a threshold.

  • If MINVALUE or MAXVALUE bounds are critical, add application-level validation or a Snowflake task to monitor sequence values.

  • Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com

SSC-EWI-TS0089

SET statement is not supported in Snowflake.

Gravidade

Low

Descrição

This issue is generated when SnowConvert AI encounters a SET statement that changes a session option not supported in Snowflake and whose non-default value cannot be replicated. For example, SET CONCAT_NULL_YIELDS_NULL OFF changes SQL Server’s NULL concatenation behavior, but Snowflake always treats NULL || value as NULL (equivalent to CONCAT_NULL_YIELDS_NULL ON). Similarly, SET NUMERIC_ROUNDABORT ON raises errors on precision loss, which Snowflake does not support. The original statement is preserved with an EWI marker.

Exemplo de código

Código de entrada:
SET CONCAT_NULL_YIELDS_NULL OFF;
Código gerado:
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0089 - SET CONCAT_NULL_YIELDS_NULL OFF IS NOT SUPPORTED IN SNOWFLAKE. ***/!!!
SET CONCAT_NULL_YIELDS_NULL OFF;

Práticas recomendadas

  • Review the downstream code that depends on this SET option. For CONCAT_NULL_YIELDS_NULL OFF, replace NULL concatenation patterns with explicit NVL() or COALESCE() calls to handle NULL values.

  • For NUMERIC_ROUNDABORT ON, add explicit rounding or precision checks in the application logic.

  • Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com

Related EWIs

  • SSC-FDM-TS0037: SET statement with equivalent default behavior in Snowflake (e.g., SET CONCAT_NULL_YIELDS_NULL ON).

SSC-EWI-TS0090

Agent Job step uses an unsupported subsystem and requires manual migration.

Gravidade

Medium

Descrição

This issue is generated when SnowConvert AI encounters a SQL Server Agent Job step that uses a subsystem other than TSQL or SSIS (e.g., CmdExec, PowerShell, ANALYSISCOMMAND). These subsystems execute operating system commands or external tools that have no direct equivalent in Snowflake. The original sp_add_jobstep call is preserved with an EWI marker, and the step is not included in the generated Snowflake Task orchestration.

Exemplo de código

Código de entrada:
EXEC msdb.dbo.sp_add_jobstep
    @job_name = N'NightlyArchive',
    @step_name = N'ArchiveOldRecords',
    @step_id = 1,
    @subsystem = N'CmdExec',
    @command = N'powershell.exe -File "C:\Scripts\archive_records.ps1"';
Código gerado:
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0090 - AGENT JOB STEP 'ArchiveOldRecords' USES UNSUPPORTED SUBSYSTEM 'CmdExec'. MANUAL MIGRATION REQUIRED. ***/!!!
EXEC msdb.dbo.sp_add_jobstep @job_name = N'NightlyArchive', @step_name = N'ArchiveOldRecords', @step_id = 1, @subsystem = N'CmdExec', @command = N'powershell.exe -File "C:\Scripts\archive_records.ps1"';

Práticas recomendadas

  • For CmdExec or PowerShell steps, evaluate whether the logic can be rewritten as a Snowflake stored procedure, external function, or Snowflake task with a SQL body.

  • For SSIS steps, use SnowConvert AI’s built-in ETL-to-dbt migration, which automatically generates orchestrator stored procedures.

  • Consider using Snowflake External Functions or Snowpark for operations that require external compute.

  • Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com

SSC-EWI-TS0091

Agent Job notification procedure requires manual setup of a Snowflake notification integration.

Gravidade

Medium

Descrição

This issue is generated when SnowConvert AI encounters a SQL Server Agent notification procedure such as sp_send_dbmail, sp_notify_operator, or similar email/alert procedures within an Agent Job context. These procedures rely on SQL Server’s Database Mail or Operator subsystem, which has no direct equivalent in Snowflake. A Snowflake notification integration must be manually configured to replicate this functionality.

Exemplo de código

Código de entrada:
EXEC msdb.dbo.sp_send_dbmail
    @profile_name = N'DBA_Alerts',
    @recipients = N'admin@example.com',
    @subject = N'ETL job completed';
Código gerado:
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0091 - AGENT JOB NOTIFICATION PROCEDURE 'sp_send_dbmail' REQUIRES MANUAL SETUP OF A SNOWFLAKE NOTIFICATION INTEGRATION. ***/!!!
EXEC msdb.dbo.sp_send_dbmail @profile_name = N'DBA_Alerts', @recipients = N'admin@example.com', @subject = N'ETL job completed';

Práticas recomendadas

SSC-EWI-TS0092

Agent Job procedure references a dynamic job name that cannot be resolved statically.

Gravidade

Medium

Descrição

This issue is generated when SnowConvert AI encounters an Agent Job management procedure (sp_start_job, sp_stop_job, sp_delete_job, sp_update_job) where the @job_name parameter is a variable rather than a string literal. Because the job name cannot be resolved at conversion time, SnowConvert AI cannot determine which Snowflake Task to reference. The original statement is preserved with an EWI marker for manual resolution.

Exemplo de código

Código de entrada:
DECLARE @jobName NVARCHAR(128);
SET @jobName = N'ETL_Daily_Load';
EXEC msdb.dbo.sp_start_job @job_name = @jobName;
Código gerado:
DECLARE
  JOBNAME NVARCHAR(128);
BEGIN
  JOBNAME := 'ETL_Daily_Load';
  !!!RESOLVE EWI!!! /*** SSC-EWI-TS0092 - AGENT JOB PROCEDURE 'sp_start_job' REFERENCES A DYNAMIC JOB NAME THAT CANNOT BE RESOLVED STATICALLY. ***/!!!
  EXEC msdb.dbo.sp_start_job @job_name = @jobName;
END;

Práticas recomendadas

  • If the job name is known at design time, replace the variable with a string literal so SnowConvert AI can resolve it to the corresponding Snowflake Task (e.g., EXECUTE TASK TASK_ETL_DAILY_LOAD).

  • If the job name is truly dynamic, use EXECUTE IMMEDIATE to build the EXECUTE TASK or ALTER TASK statement dynamically in Snowflake Scripting.

  • Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com

SSC-EWI-TS0093

Agent Job procedure is not supported.

Gravidade

Low

Descrição

This issue is generated when SnowConvert AI encounters a SQL Server Agent Job system procedure that does not have a supported translation to Snowflake. This includes procedures like sp_update_jobstep, sp_add_jobserver, and sp_update_job (when used without the @enabled parameter). These procedures manage Agent Job metadata that has no equivalent in Snowflake’s Task framework. The original statement is preserved with an EWI marker.

Exemplo de código

Código de entrada:
EXEC msdb.dbo.sp_update_jobstep
    @job_name = N'ETL_Nightly_Load',
    @step_id = 1,
    @step_name = N'UpdatedStepName';
Código gerado:
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0093 - AGENT JOB PROCEDURE 'sp_update_jobstep' IS NOT SUPPORTED. ***/!!!
EXEC msdb.dbo.sp_update_jobstep @job_name = N'ETL_Nightly_Load', @step_id = 1, @step_name = N'UpdatedStepName';

Práticas recomendadas

  • Review whether the procedure’s functionality is still needed in the Snowflake environment. Many Agent Job metadata operations (renaming steps, assigning servers) are not applicable in Snowflake’s Task model.

  • If the procedure modifies job scheduling or enablement, use ALTER TASK in Snowflake instead.

  • Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com

SSC-EWI-TS0094

Error Message

WAITFOR DELAY variable may contain a time string incompatible with SYSTEM$WAIT.

Gravidade

Medium

Descrição

This EWI is generated when a WAITFOR DELAY statement uses a variable or parameter expression instead of a literal time value. The statement is transformed to CALL SYSTEM$WAIT(), which expects a numeric value representing seconds (or milliseconds). However, the variable may hold a time string in 'HH:MM:SS' format, which is incompatible with SYSTEM$WAIT.

For more information about SYSTEM$WAIT, see the Snowflake documentation.

Exemplo de código

Código de entrada:
 CREATE PROCEDURE proc1(@WaitTime INT)
AS
BEGIN
  WAITFOR DELAY @WaitTime;
END
Código gerado:
 CREATE OR REPLACE PROCEDURE proc1 (WAITTIME INT)
RETURNS VARCHAR
LANGUAGE SQL
EXECUTE AS CALLER
AS
$$
  BEGIN
    !!!RESOLVE EWI!!! /*** SSC-EWI-TS0094 - WAITFOR DELAY WITH VARIABLE ':WAITTIME' WAS CONVERTED TO SYSTEM$WAIT, BUT THE VARIABLE MAY CONTAIN A TIME STRING IN 'HH:MM:SS' FORMAT. SYSTEM$WAIT EXPECTS A NUMERIC VALUE IN SECONDS. ***/!!!
    CALL SYSTEM$WAIT(:WAITTIME);
  END;
$$;

Práticas recomendadas

  • Ensure the variable passed to SYSTEM$WAIT contains a numeric value in seconds, not a time string in 'HH:MM:SS' format.

  • If the variable holds a time string, convert it to seconds before passing it to SYSTEM$WAIT.

  • Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com

SSC-EWI-TS0095

SCOPE_IDENTITY() called without a preceding INSERT to an identity table in the same scope.

Gravidade

High

Nota

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

Descrição

SnowConvert AI was unable to determine the target table for SCOPE_IDENTITY(). No preceding INSERT to an identity table found in the same scope.

This EWI is generated when SCOPE_IDENTITY() is called without a preceding INSERT statement to a table with an IDENTITY column in the same procedural scope. In SQL Server, SCOPE_IDENTITY() returns the last identity value inserted in the current scope, but without a detectable INSERT, SnowConvert AI cannot generate the appropriate time-travel query.

The function call is kept as-is with this EWI, requiring manual review to determine the correct implementation.

Exemplo de código

Input Code (SQL Server):
 CREATE PROCEDURE GetLastId
AS
BEGIN
    DECLARE @LastID INT = SCOPE_IDENTITY();
    SELECT @LastID;
END;
Generated Code (Snowflake):
 CREATE OR REPLACE PROCEDURE GetLastId ()
RETURNS TABLE()
LANGUAGE SQL
EXECUTE AS CALLER
AS
$$
  DECLARE
    LASTID INT := SCOPE_IDENTITY() !!!RESOLVE EWI!!! /*** SSC-EWI-TS0095 - SNOWCONVERT AI WAS UNABLE TO DETERMINE THE TARGET TABLE FOR SCOPE_IDENTITY(). NO PRECEDING INSERT TO AN IDENTITY TABLE FOUND IN THE SAME SCOPE. ***/!!!;
    ProcedureResultSet RESULTSET;
  BEGIN
    ProcedureResultSet := (SELECT
      :LASTID);
    RETURN TABLE(ProcedureResultSet);
  END;
$$;

Práticas recomendadas

  • Review the stored procedure logic to identify where the INSERT statement occurs

  • If the INSERT is in a different scope (e.g., nested block), refactor the code to make the INSERT detectable

  • Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com

SSC-EWI-TS0096

SCOPE_IDENTITY() references a table that cannot be resolved in the symbol table.

Gravidade

High

Nota

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

Descrição

SnowConvert AI was unable to resolve the target table for SCOPE_IDENTITY(). Missing table definition.

This EWI is generated when SCOPE_IDENTITY() follows an INSERT statement, but the target table cannot be resolved in the symbol table. This may occur when:

  • The table is defined in an external file not included in the conversion

  • The table name uses dynamic SQL or is otherwise unresolvable

  • The table definition is missing or incomplete

Without a resolvable table reference, SnowConvert AI cannot determine which identity column to query in the generated time-travel query.

Exemplo de código

Input Code (SQL Server):
 CREATE PROCEDURE InsertOrder @CustomerID INT
AS
BEGIN
    DECLARE @OrderID INT;
    INSERT INTO UnknownTable (CustomerID) VALUES (@CustomerID);
    SET @OrderID = SCOPE_IDENTITY();
    SELECT @OrderID;
END;
Generated Code (Snowflake):
 CREATE OR REPLACE PROCEDURE InsertOrder (CUSTOMERID INT)
RETURNS TABLE()
LANGUAGE SQL
EXECUTE AS CALLER
AS
$$
  DECLARE
    ORDERID INT;
    ProcedureResultSet RESULTSET;
  BEGIN

    INSERT INTO UnknownTable (CustomerID) VALUES (:CUSTOMERID);
    ORDERID := SCOPE_IDENTITY() !!!RESOLVE EWI!!! /*** SSC-EWI-TS0096 - SNOWCONVERT AI WAS UNABLE TO RESOLVE THE TARGET TABLE FOR SCOPE_IDENTITY(). MISSING TABLE DEFINITION. ***/!!!;
    ProcedureResultSet := (SELECT
      :ORDERID);
    RETURN TABLE(ProcedureResultSet);
  END;
$$;

Práticas recomendadas

  • Ensure all table definitions are included in the conversion input

  • Verify that the table name in the INSERT statement matches the table definition

  • If the table is external, provide the schema definition or manually implement the identity retrieval logic

  • Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com

SSC-EWI-TS0097

SCOPE_IDENTITY() references a table without an identifiable identity column.

Gravidade

High

Nota

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

Descrição

SnowConvert AI was unable to identify the identity column for SCOPE_IDENTITY(). Missing column definition.

This EWI is generated when SCOPE_IDENTITY() follows an INSERT statement to a table that exists in the symbol table but does not have an IDENTITY column defined. In SQL Server, SCOPE_IDENTITY() only returns values for tables with identity columns. Without an identifiable identity column, SnowConvert AI cannot generate the appropriate MAX(identity_column) query for the time-travel transformation.

Exemplo de código

Input Code (SQL Server):
 CREATE TABLE Orders (OrderID INT, CustomerID INT);
GO

CREATE PROCEDURE InsertOrder @CustomerID INT
AS
BEGIN
    DECLARE @OrderID INT;
    INSERT INTO Orders (CustomerID) VALUES (@CustomerID);
    SET @OrderID = SCOPE_IDENTITY();
    SELECT @OrderID;
END;
Generated Code (Snowflake):
 CREATE OR REPLACE TABLE Orders (
  OrderID INT,
  CustomerID INT
)
;

CREATE OR REPLACE PROCEDURE InsertOrder (CUSTOMERID INT)
RETURNS TABLE()
LANGUAGE SQL
EXECUTE AS CALLER
AS
$$
  DECLARE
    ORDERID INT;
    ProcedureResultSet RESULTSET;
  BEGIN

    INSERT INTO Orders (CustomerID) VALUES (:CUSTOMERID);
    ORDERID := SCOPE_IDENTITY() !!!RESOLVE EWI!!! /*** SSC-EWI-TS0097 - SNOWCONVERT AI WAS UNABLE TO IDENTIFY THE IDENTITY COLUMN FOR SCOPE_IDENTITY(). MISSING COLUMN DEFINITION. ***/!!!;
    ProcedureResultSet := (SELECT
      :ORDERID);
    RETURN TABLE(ProcedureResultSet);
  END;
$$;

Práticas recomendadas

  • Verify that the table definition includes an IDENTITY column specification

  • If the table should have an identity column, add the IDENTITY constraint to the CREATE TABLE statement before conversion

  • If the table should not use SCOPE_IDENTITY(), refactor the code to use a different method for retrieving the inserted ID

  • Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com

SSC-EWI-TS0098

CONVERT with a non-literal style cannot be mapped to a Snowflake format string.

Gravidade

Medium

Descrição

This EWI is generated when the third argument of CONVERT is a variable or expression instead of a literal style code. SnowConvert AI can map literal style values to Snowflake format strings for TO_DATE and TO_TIMESTAMP, but when the style is dynamic it cannot determine the correct format at conversion time. In those cases SnowConvert AI falls back to CAST.

Exemplo de código

Input Code (SQL Server):
SELECT CONVERT(DATE, @InputDate, @Style);
Generated Code (Snowflake SQL):
SELECT
  !!!RESOLVE EWI!!! /*** SSC-EWI-TS0098 - CONVERT WITH A VARIABLE OR EXPRESSION AS THE STYLE ARGUMENT CANNOT BE AUTOMATICALLY MAPPED TO A SNOWFLAKE FORMAT STRING. REPLACE WITH THE APPROPRIATE TO_DATE/TO_TIMESTAMP CALL WITH THE KNOWN FORMAT STRING. ***/!!!
  CAST(@InputDate AS DATE);

Práticas recomendadas

  • Replace the dynamic style argument with a known literal format whenever possible.

  • If the style varies at runtime, rewrite the expression manually using the correct TO_DATE, TO_TIMESTAMP, or conditional logic in Snowflake.

  • Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com