SnowConvert AI - Problemas gerais¶
SSC-EWI-0001¶
Token não reconhecido na linha do código-fonte.
Nota
Algumas partes do código de saída foram omitidas por motivos de clareza.
Gravidade¶
Crítico
Descrição¶
Este problema ocorre quando há um erro ao analisar o código-fonte que está sendo convertido. Isso significa que há um erro de sintaxe do código-fonte ou uma instrução específica do código ainda não está sendo reconhecida.
Exemplo de código¶
O exemplo a seguir ilustra diferentes cenários de análise de erro em que a sintaxe inválida é colocada na entrada. Observe como a mensagem varia entre cada cenário; esse conteúdo pode ser útil para isolar e corrigir o problema. Para obter mais informações, consulte “Conteúdo da mensagem” abaixo.
Código de entrada: ¶
CRATE;
CREATE TABLE someTable(col1 INTEGER, !);
CREATE TABRE badTable(col1 INTEGER);
CREATE PROCEDURE proc1()
BEGIN
CREATE TABLE badEmbeddedTable(col1 INTEGER);
END;
Código gerado: ¶
-- ** SSC-EWI-0001 - UNRECOGNIZED TOKEN ON LINE '1' COLUMN '1' OF THE SOURCE CODE STARTING AT 'CRATE'. EXPECTED 'STATEMENT' GRAMMAR. LAST MATCHING TOKEN WAS 'CRATE' ON LINE '1' COLUMN '1'. **
--CRATE
;
CREATE OR REPLACE TABLE someTable (
col1 INTEGER
-- ,
-- ** SSC-EWI-0001 - UNRECOGNIZED TOKEN ON LINE '3' COLUMN '37' OF THE SOURCE CODE STARTING AT '!'. EXPECTED 'Column Definition' GRAMMAR. LAST MATCHING TOKEN WAS ',' ON LINE '3' COLUMN '35'. FAILED TOKEN WAS '!' ON LINE '3' COLUMN '37'. **
-- !
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "teradata", "convertedOn": "07/04/2024" }}'
;
-- ** SSC-EWI-0001 - UNRECOGNIZED TOKEN ON LINE '5' COLUMN '1' OF THE SOURCE CODE STARTING AT 'CREATE'. EXPECTED 'STATEMENT' GRAMMAR. LAST MATCHING TOKEN WAS 'CREATE' ON LINE '5' COLUMN '1'. **
--CREATE TABRE badTable(col1 INTEGER)
;
CREATE OR REPLACE PROCEDURE proc1 ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "teradata", "convertedOn": "07/04/2024" }}'
EXECUTE AS CALLER
AS
$$
BEGIN
CREATE OR REPLACE TABLE badEmbeddedTable (
col1 INTEGER);
END;
$$;
Conteúdo da mensagem¶
Cláusula inicial: Especifica a localização inicial (linha, coluna e «texto») do código não reconhecido. O código será transformado em comentário a partir do elemento «texto» para cada elemento não reconhecido até que o analisador localize um possível ponto de recuperação.
Cláusula gramatical esperada: Especifica o tipo de gramática que o analisador estava esperando. Verifique se o código em comentário tem um tipo correspondente da gramática esperada.
Cláusula de último token correspondente (OPTIONAL): Pode aparecer se o código não reconhecido foi parcialmente reconhecido. Isso sinaliza o ponto até o qual o analisador reconheceu os elementos válidos, portanto, verifique os seguintes tokens no código em comentário para ter certeza de que são válidos.
Cláusula de token com falha (OPTIONAL): Só pode estar presente quando uma “cláusula de último token correspondente” também estiver presente. Isto representa em que ponto o analisador determinou que o código é inválido ou não é reconhecido. Certifique-se de que este elemento possa ser colocado nesta localização sintático.
Conteúdo da mensagem obsoleto¶
Nota
Os itens desta lista não estão em uso ativamente e são deixados aqui para fins históricos.
Código de recuperação (DEPRECATED): Destina-se a ser usado como um código de erro, e pode ser fornecido para melhor suporte durante solicitações de atualização do analisador. Ele representa como o analisador acionou seu mecanismo de recuperação.
Práticas recomendadas¶
Verifique se o código-fonte tem a sintaxe correta.
A mensagem pode ser usada para isolar e resolver o problema.
Se for incompatível, a sintaxe poderá ser alterada manualmente para uma sintaxe compatível.
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-EWI-0002¶
Os parâmetros padrão podem precisar ser reordenados
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:¶
CREATE OR REPLACE PROCEDURE MySampleProc
!!!RESOLVE EWI!!! /*** SSC-EWI-0002 - DEFAULT PARAMETERS MAY NEED TO BE REORDERED. SNOWFLAKE ONLY SUPPORTS DEFAULT PARAMETERS AT THE END OF THE PARAMETERS DECLARATIONS ***/!!!
(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¶
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-EWI-0003¶
A coluna do sistema para objeto interno não foi traduzida.
Severidade ¶
Medium
Descrição ¶
Este EWI é gerado quando o SnowConvert AI mapeia um objeto de sistema interno (tabela, exibição) para o objeto equivalente no Snowflake, mas não há nenhum mapa para uma de suas colunas internas.
Exemplo de código ¶
Código de entrada:
select name,
parent_object_id
from sys.tables;
Código de saída:
Snowflake¶
select
TABLE_NAME,
parent_object_id !!!RESOLVE EWI!!! /*** SSC-EWI-0003 - SYSTEM COLUMN 'parent_object_id' FOR BUILT-IN OBJECT 'SYS.TABLES' HAS NOT BEEN TRANSLATED. ***/!!!
from
INFORMATION_SCHEMA.TABLES;
SSC-EWI-0005¶
Gravidade¶
Crítico
Descrição¶
Este problema aparece quando, ao tentar converter o código-fonte, ocorre um erro de transformação inesperado e o arquivo de código de saída não é gerado.
Práticas recomendadas¶
Verifique o arquivo de log de erros para obter mais informações sobre o problema#.
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-EWI-0006¶
O formato de data/numérico atual pode ter um comportamento diferente no Snowflake.
Gravidade¶
Medium
Descrição¶
Este erro é adicionado porque o Snowflake não é compatível com formatos de data/numéricos em algumas funções conforme a linguagem de origem.
Os elementos de formato a seguir são aqueles que podem se comportar de maneira diferente no Snowflake:
Data/hora do Redshift¶
| Format Element | Description |
|---|---|
| HH | Hour of day (01–12). |
| MS | Millisecond (000–999). |
| US | Microsecond (000000–999999). |
| SSSS, SSSSS | Seconds past midnight (0–86399). |
| Y,YYY | Year (4 or more digits) with comma. |
| YYY | Last 3 digits of year. |
| Y | Last digit of year. |
| IYYY | ISO 8601 week-numbering year(4 or more digits). |
| IYY | Last 3 digits of ISO 8601 week-numbering year. |
| IY | Last 2 digits of ISO 8601 week-numbering year. |
| I | Last digit of ISO 8601 week-numbering year. |
| BC, bc, AD or ad | Era indicator (without periods). |
| B.C., b.c., A.D. or a.d. | Era indicator (with periods). |
| MONTH | Full upper case month name (blank-padded to 9 chars). |
| Month | Full capitalized month name (blank-padded to 9 chars). |
| month | Full lower case month name (blank-padded to 9 chars). |
| DAY | Full upper case day name (blank-padded to 9 chars). |
| Day | Full capitalized day name (blank-padded to 9 chars). |
| day | Full lower case day name (blank-padded to 9 chars). |
| DDD | Day of year (001–366). |
| IDDD | Day of ISO 8601 week-numbering year (001–371; day 1 of the year is Monday of the first ISO week). |
| D | Day of the week, Sunday (1) to Saturday (7). |
| ID | ISO 8601 day of the week, Monday (1) to Sunday (7). |
| W | Week of month (1–5) (the first week starts on the first day of the month). |
| WW | Week number of year (1–53) (the first week starts on the first day of the year). |
| IW | Week number of ISO 8601 week-numbering year (01–53; the first Thursday of the year is in week 1). |
| CC | Century (2 digits) (the twenty-first century starts on 2001-01-01). |
| J | Julian Date. |
| Q | Quarter. |
| RM | Month in upper case Roman numerals (I–XII; I=January). |
| rm | Month in lower case Roman numerals (i–xii; i=January). |
| TZ | Upper case time-zone abbreviation (only supported in to_char). |
| tz | Lower case time-zone abbreviation (only supported in to_char). |
| TZH | Time-zone hours. |
| TZM | Time-zone minutes. |
| OF | Time-zone offset from UTC (only supported in to_char). |
| FM prefix | Fill mode (suppress leading zeroes and padding blanks). |
| TH suffix | Upper case ordinal number suffix. |
| th suffix | Lower case ordinal number suffix. |
| FX prefix | Fixed format global option (see usage notes). |
| TM prefix | Translation mode (use localized day and month names based on lc_time). |
| SP suffix | Spell mode. |
Nota
Para obter mais informações, consulte Formatos de data/hora do PostgreSQL.
Nota
A transformação da função TO_CHAR é compatível com a maioria desses elementos de formato. Para obter uma lista completa dos elementos de formato compatíveis e seus mapeamentos equivalentes, consulte a Especificação de tradução
Formato do BigQuery ¶
Revise a lista detalhada aqui.
Numérico ¶
Padrão |
Descrição |
|---|---|
PR |
valor negativo entre colchetes angulares |
RN |
Numeral romano (entrada entre 1 e 3999) |
TH ou o |
sufixo de número ordinal |
V |
deslocamento do número especificado de dígitos (consulte as observações) |
EEEE |
expoente para notação científica |
Nota
Para obter mais informações, consulte Formatos numéricos do PostgreSQL.
Exemplo de código¶
Código de entrada:¶
PostgreSQL¶
SELECT
DATE_TRUNC('decade', TIMESTAMP '2017-03-17 02:09:30'),
DATE_TRUNC('century', TIMESTAMP '2017-03-17 02:09:30'),
DATE_TRUNC('millennium', TIMESTAMP '2017-03-17 02:09:30');
Código gerado:¶
Snowflake¶
SELECT
!!!RESOLVE EWI!!! /*** SSC-EWI-PG0005 - DECADE FORMAT IS NOT SUPPORTED IN SNOWFLAKE. ***/!!!
DATE_TRUNC('decade', TIMESTAMP '2017-03-17 02:09:30'),
!!!RESOLVE EWI!!! /*** SSC-EWI-PG0005 - CENTURY FORMAT IS NOT SUPPORTED IN SNOWFLAKE. ***/!!!
DATE_TRUNC('century', TIMESTAMP '2017-03-17 02:09:30'),
!!!RESOLVE EWI!!! /*** SSC-EWI-PG0005 - MILLENNIUM FORMAT IS NOT SUPPORTED IN SNOWFLAKE. ***/!!!
DATE_TRUNC('millennium', TIMESTAMP '2017-03-17 02:09:30');
Práticas recomendadas¶
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-EWI-0007¶
Gravidade¶
Crítico
Descrição¶
Este erro aparece quando ocorre um erro ao gravar o arquivo de saída.
Práticas recomendadas¶
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-EWI-0008¶
A cláusula COLLATE pode ter um comportamento diferente no Snowflake
Gravidade¶
Medium
Descrição¶
Este aviso é adicionado quando a cláusula de agrupamento é usada como uma opção de coluna por ser compatível com o Snowflake, mas pode se comportar de forma diferente na especificação de agrupamento. Revise a documentação de agrupamento para verificar quais especificadores são compatíveis com o Snowflake.
Exemplo de código¶
Código de entrada:¶
CREATE TABLE TABLE01 (
col1 text COLLATE "C"
);
Código gerado: ¶
CREATE TABLE TABLE01 (
col1 text
!!!RESOLVE EWI!!! /*** SSC-EWI-0008 - COLLATE CLAUSE MAY HAVE A DIFFERENT BEHAVIOR IN SNOWFLAKE. ***/!!! COLLATE "C"
);
Práticas recomendadas¶
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-EWI-0009¶
A função Regexp_Substr só é compatível com expressões regulares POSIX.
Gravidade¶
Low
Descrição¶
Atualmente, o Snowflake não é compatível com a expressão regular estendida além das sintaxe de expressão regular POSIX básica.
Este EWI é adicionado toda vez que uma chamada de função para REGEX_SUBSTR, REGEX_REPLACE ou REGEX_INSTR é transformada em SnowFlake para alertar o usuário sobre possíveis expressões regulares incompatíveis. Alguns dos recursos incompatíveis são lookahead, lookbehind e grupos sem captura.
Exemplo de código¶
Código de entrada: ¶
SELECT REGEXP_SUBSTR('qaqequ','q(?=u)', 1, 1);
Código gerado:¶
SELECT
!!!RESOLVE EWI!!! /*** SSC-EWI-0009 - REGEXP_SUBSTR FUNCTION ONLY SUPPORTS POSIX REGULAR EXPRESSIONS ***/!!!
REGEXP_SUBSTR('qaqequ','q(?=u)', 1, 1);
Práticas recomendadas¶
Verifique a expressão regular usada em cada caso para determinar se ela precisa de intervenção manual. Mais informações sobre o suporte expandido a expressões regulares e alternativas no SnowFlake podem ser encontradas aqui.
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-EWI-0010¶
Gravidade¶
Crítico
Descrição¶
Este erro aparece quando não há uma regra de transformação para uma instrução de procedimento específica.
Práticas recomendadas¶
Verifique se a instrução de procedimento está correta.
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-EWI-0011¶
Gravidade¶
High
Descrição¶
Este erro aparece quando há um fim inesperado da instrução no código-fonte e o erro não pode ser tratado corretamente.
Práticas recomendadas¶
Verifique se o código-fonte está incompleto ou se a instrução que está sendo convertida termina corretamente.
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-EWI-0012¶
Gravidade¶
High
Descrição¶
Este erro aparece quando há um fim inesperado da instrução no código-fonte
Exemplo de código¶
Código de entrada:¶
CREATE VOLATILE SET TABLE VOLATILETABLE
(
COL1 INTEGER,
COL2 INTEGER,
COL3 INTEGER
)
ON COMMIT PRESERVE ROWS;
UPDATE TABLE2 as T2
SET T2.COL1 + VOLATILETABLE.COL1
WHERE T2.COL2 = VOLATILETABLE.COL2
AND T2.COL3 = VOLATILETABLE.COL3
AND T2.COL4 = ( SELECT MAX(T3.COL1)
FROM
TABLE3 T3
WHERE T3.COL1 = T2.COL1);
Código gerado: ¶
--** SSC-FDM-TD0024 - SET TABLE FUNCTIONALITY NOT SUPPORTED. TABLE MIGHT HAVE DUPLICATE ROWS **
CREATE OR REPLACE TEMPORARY TABLE VOLATILETABLE
(
COL1 INTEGER,
COL2 INTEGER,
COL3 INTEGER
)
-- --** SSC-FDM-0008 - ON COMMIT NOT SUPPORTED **
--ON COMMIT PRESERVE ROWS
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
;
--** SSC-FDM-0007 - MISSING DEPENDENT OBJECTS "TABLE2", "TABLE3" **
UPDATE TABLE2 AS T2
SET
--** SSC-FDM-0025 - UNEXPECTED END OF STATEMENT. PLEASE CHECK THE LINE 9 OF ORIGINAL SOURCE CODE. **
T2.COL1 + VOLATILETABLE.COL1
FROM
VOLATILETABLE
WHERE T2.COL2 = _VOLATILETABLE.COL2
AND T2.COL3 = _VOLATILETABLE.COL3
AND T2.COL4 = (
SELECT
MAX(T3.COL1)
FROM
TABLE3 T3
WHERE T3.COL1 = T2.COL1);
Recomendação¶
Verifique se o código-fonte está incompleto ou se a instrução que está sendo convertida termina corretamente.
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-EWI-0013¶
Gravidade¶
Crítico
Descrição¶
Este erro aparece quando uma exceção é gerada ao converter um item do código-fonte.
Recomendação¶
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-EWI-0014¶
Gravidade¶
Crítico
Descrição¶
Este erro aparece quando o corpo de uma instrução de procedimento específica não é gerada.
Práticas recomendadas¶
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-EWI-0015¶
Função múltipla Pivot/Unpivot incompatível.
Nota
Algumas partes do código de saída foram omitidas por motivos de clareza.
Gravidade¶
Medium
Descrição¶
Esta seção descreve os diferentes problemas que poderiam ser acionados pelas cláusulas PIVOT e UNPIVOT. Os cenários incompatíveis são apresentados na tabela a seguir.
PIVOT |
UNPIVOT |
ORACLE |
TERADATA |
|
|---|---|---|---|---|
MULTIPLE COLUMN |
X |
X |
X |
X |
RENAME COLUMN |
X |
X |
X |
X |
MULTIPLE FUNCTION |
X |
X |
X |
|
WITH CLAUSE |
X |
X |
||
XML OUTPUT FORMAT |
X |
X |
||
IN CLAUSE SUBQUERY |
X |
X |
X |
|
IN CLAUSE ANY SEQUENCE |
X |
X |
||
INCLUDE/EXCLUDE NULLS |
X |
X |
X |
MULTIPLE COLUMN¶
As cláusulas PIVOT e UNPIVOT não aceitam várias colunas.
Exemplo de código¶
Código de entrada:¶
SELECT * FROM star1p UNPIVOT ((sales,cogs) FOR yr_qtr
IN ((Q101Sales, Q101Cogs) AS 'Q101A',
(Q201Sales, Q201Cogs) AS 'Q201A',
(Q301Sales, Q301Cogs) AS 'Q301A')) AS Tmp;
Código gerado:¶
// SnowConvert AI Helpers Code section is omitted.
SELECT * FROM
star1p
!!!RESOLVE EWI!!! /*** SSC-EWI-0015 - PIVOT/UNPIVOT MULTIPLE COLUMN NOT SUPPORTED ***/!!!
UNPIVOT ((sales,cogs) FOR yr_qtr
!!!RESOLVE EWI!!! /*** SSC-EWI-0015 - PIVOT/UNPIVOT MULTIPLE COLUMN NOT SUPPORTED ***/!!!
IN ((Q101Sales, Q101Cogs) AS 'Q101A',
(Q201Sales, Q201Cogs) AS 'Q201A',
(Q301Sales, Q301Cogs) AS 'Q301A')) AS Tmp;
RENAME COLUMN¶
A renomeação de colunas com aliases não é compatível com as cláusulas UNPIVOT do Snowflake. O Snow Convert removerá aliases para funções ou colunas a fim de criar uma consulta válida e verificar se essa alteração não afeta a funcionalidade original.
Para PIVOT, o uso de aliases de coluna só será compatível no SnowConvert AI para Teradata se as duas condições a seguir forem verdadeiras: todas as expressões dentro da cláusula IN tendo um alias associado e o SnowConvert AI tendo informações sobre as colunas que serão geradas como resultado, seja fornecendo a definição da tabela ou usando uma subconsulta com uma lista de colunas explícita como entrada para a cláusula.
Exemplo de código¶
Código de entrada:¶
CREATE TABLE star1(
country VARCHAR(20),
state VARCHAR(10),
yr INTEGER,
qtr VARCHAR(3),
sales INTEGER,
cogs INTEGER
);
--SAMPLE 1
SELECT * FROM db1.star1p UNPIVOT (column1 FOR for_column
IN (col1 AS 'as_col1', col2 AS 'as_col2')) Tmp;
--SAMPLE 2
SELECT *
FROM star1 PIVOT (
SUM(sales) as ss1 FOR qtr
IN ('Q1' AS Quarter1,
'Q2' AS Quarter2,
'Q3' AS Quarter3)
)Tmp;
--SAMPLE 3
SELECT
*
FROM (
SELECT
country,
state,
yr,
qtr,
sales,
cogs
FROM star1 ) A
PIVOT (
SUM(sales) as ss1 FOR qtr
IN ('Q1' AS Quarter1,
'Q2' AS Quarter2,
'Q3' AS Quarter3)
)Tmp;
Código gerado:¶
CREATE OR REPLACE TABLE star1 (
country VARCHAR(20),
state VARCHAR(10),
yr INTEGER,
qtr VARCHAR(3),
sales INTEGER,
cogs INTEGER
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "teradata", "convertedOn": "08/14/2024" }}'
;
--SAMPLE 1
--** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "db1.star1p" **
SELECT
* FROM db1.star1p UNPIVOT (column1 FOR for_column
IN (col1 AS 'as_col1', col2 AS 'as_col2')) Tmp !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'PivotUnpivotTableReference' NODE ***/!!!;
--SAMPLE 2
SELECT
*
FROM
star1 PIVOT (
SUM(sales) FOR qtr IN ('Q1',
'Q2',
'Q3')) Tmp (
country,
state,
yr,
cogs,
Quarter1_ss1,
Quarter2_ss1,
Quarter3_ss1
);
--SAMPLE 3
SELECT
*
FROM (
SELECT
country,
state,
yr,
qtr,
sales,
cogs
FROM
star1
) A
PIVOT (
SUM(sales) FOR qtr IN ('Q1',
'Q2',
'Q3')) Tmp (
country,
state,
yr,
cogs,
Quarter1_ss1,
Quarter2_ss1,
Quarter3_ss1
);
MULTIPLE FUNCTION¶
A função múltipla não é compatível com cláusulas PIVOT. Às vezes, consultas de funções múltiplas podem ser reescritas usando instruções de maiúsculas e minúsculas. Consulte a seguinte amostra do Teradata para mais informações https://docs.teradata.com/r/756LNiPSFdY~4JcCCcR5Cw/L0kKSOrOeu_68mcW3o8ilw
Exemplo de código¶
Código de entrada:¶
SELECT *
FROM STAR1 PIVOT(SUM(COL1), SUM(COL2) FOR YR IN ('Y1', 'Y2', 'Y3'))TMP;
Código gerado:¶
// SnowConvert AI Helpers Code section is omitted.
SELECT
*
FROM
STAR1
!!!RESOLVE EWI!!! /*** SSC-EWI-0015 - PIVOT/UNPIVOT MULTIPLE FUNCTION NOT SUPPORTED ***/!!!
PIVOT(SUM(COL1), SUM(COL2) FOR YR IN ('Y1', 'Y2', 'Y3'))TMP;
WITH CLAUSE¶
A PIVOT do Teradata tem uma cláusula WITH opcional, o que não é permitido na PIVOT do Snowflake.
Exemplo de código¶
Código de entrada:¶
SELECT *
FROM STAR1 PIVOT(SUM(COL1) FOR YR IN ('Y1', 'Y2', 'Y3') WITH SUM(*) AS withalias)TMP;
Código gerado:¶
// SnowConvert AI Helpers Code section is omitted.
SELECT
*
FROM
STAR1 PIVOT(SUM(COL1) FOR YR IN ('Y1', 'Y2', 'Y3')
!!!RESOLVE EWI!!! /*** SSC-EWI-0015 - PIVOT/UNPIVOT WITH CLAUSE NOT SUPPORTED ***/!!!
WITH SUM(*) AS withalias)TMP;
XML OUTPUT FORMAT¶
A saída XML da cláusula PIVOT é incompatível com o Snowflake.
Exemplo de código¶
Código de entrada:¶
SELECT * FROM (SELECT product_code, quantity FROM pivot_test)
PIVOT XML (SUM(quantity)
FOR (product_code) IN ('A','B','C'));
Código gerado:¶
// SnowConvert AI Helpers Code section is omitted.
SELECT * FROM
(
SELECT product_code, quantity FROM
pivot_test)
!!!RESOLVE EWI!!! /*** SSC-EWI-0015 - PIVOT/UNPIVOT XML OUTPUT FORMAT NOT SUPPORTED ***/!!!
PIVOT (SUM(quantity) FOR product_code IN ( 'A', 'B', 'C'));
IN CLAUSE SUBQUERY¶
As subconsultas para a cláusula IN é incompatível.
Exemplo de código¶
Código de entrada:¶
SELECT * FROM s1 PIVOT(SUM(COL1) FOR FORCOL IN (SELECT SELCOL FROM S2))DT;
Código gerado:¶
// SnowConvert AI Helpers Code section is omitted.
SELECT * FROM
s1 PIVOT (SUM(COL1) FOR FORCOL
!!!RESOLVE EWI!!! /*** SSC-EWI-0015 - PIVOT/UNPIVOT IN CLAUSE SUBQUERY NOT SUPPORTED ***/!!! IN (SELECT SELCOL FROM
S2));
IN CLAUSE ANY SEQUENCE¶
Este erro é acionado quando a palavra-chave ANY é usada na cláusula IN. Isto não é compatível atualmente.
Código de exemplo¶
Código de entrada:¶
SELECT * FROM (SELECT product_code, quantity FROM pivot_test)
PIVOT (SUM(quantity)
FOR product_code IN (ANY, ANY, ANY));
Código gerado:¶
// SnowConvert AI Helpers Code section is omitted.
SELECT * FROM (SELECT product_code, quantity FROM
pivot_test)
PIVOT (SUM(quantity)
FOR product_code
!!!RESOLVE EWI!!! /*** SSC-EWI-0015 - PIVOT/UNPIVOT IN CLAUSE ANY SEQUENCE NOT SUPPORTED ***/!!!
IN (ANY, ANY, ANY));
INCLUDE/EXCLUDE NULLS¶
INCLUDE NULLS ou EXCLUDE NULLS não são opções válidas para cláusulas UNPIVOT no Snowflake.
Exemplo de código¶
Código de entrada:¶
SELECT * FROM db1.star1p UNPIVOT INCLUDE NULLS (column1 FOR for_column IN (col1, col2)) Tmp;
Código gerado:¶
// SnowConvert AI Helpers Code section is omitted.
SELECT * FROM
db1.star1p
!!!RESOLVE EWI!!! /*** SSC-EWI-0015 - PIVOT/UNPIVOT INCLUDE NULLS NOT SUPPORTED ***/!!!
UNPIVOT ( column1 FOR for_column IN (
col1,
col2)) Tmp;
Práticas recomendadas¶
Reescreva a consulta, se possível. Caso contrário, nenhuma ação adicional do usuário será necessária.
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-EWI-0016¶
O Snowflake não é compatível com a cláusula de opções.
Severidade ¶
Medium
Descrição ¶
Este EWI é adicionado a instruções DDLs quando o OPTIONS não tem opções compatíveis com o Snowflake.
Exemplo de código ¶
Código de entrada:
BigQuery¶
CREATE VIEW my_view
OPTIONS (
expiration_timestamp=TIMESTAMP "2026-01-01 00:00:00 UTC",
privacy_policy='{"aggregation_threshold_policy": {"threshold": 50, "privacy_unit_columns": "ID"}}'
) AS
SELECT column1, column2
FROM my_table;
Código de saída:
Snowflake¶
CREATE VIEW my_view
!!!RESOLVE EWI!!! /*** SSC-EWI-0016 - SNOWFLAKE DOES NOT SUPPORT THE OPTIONS: EXPIRATION_TIMESTAMP, PRIVACY_POLICY. ***/!!!
OPTIONS(
expiration_timestamp=TIMESTAMP "2026-01-01 00:00:00 UTC",
privacy_policy='{"aggregation_threshold_policy": {"threshold": 50, "privacy_unit_columns": "ID"}}'
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "bigquery", "convertedOn": "07/10/2025", "domain": "no-domain-provided" }}'
AS
SELECT column1, column2
FROM
my_table;
SSC-EWI-0020¶
CUSTOM UDF INSERTED.
Gravidade¶
Low
Resumo¶
Há várias funções definidas pelo usuário (UDF) fornecidas por SnowConvert AI e usadas para reproduzir comportamentos de linguagem de origem que são incompatíveis com o Snowflake, as funcionalidades e descrições são detalhadas abaixo.
As UDFs são encontradas na pasta «UDF Helpers» criada no caminho de saída após a ocorrência da migração.
Práticas recomendadas¶
Verifique se a pasta UDF Helpers está sendo criada com arquivos dentro.
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-EWI-0021¶
Sem suporte.
Gravidade¶
Medium
Descrição¶
Esta mensagem aparece quando um nó ou instrução específica do código-fonte não é compatível com o Snowflake.
Exemplo de código¶
Código de entrada: ¶
WITH my_av ANALYTIC VIEW AS
(USING sales_av HIERARCHIES(time_hier) ADD MEASURES(lag_sales AS (LAG(sales) OVER (HIERARCHY time_hier OFFSET 1 ))))
SELECT aValue from my_av;
Código gerado:¶
!!!RESOLVE EWI!!! /*** SSC-EWI-0021 - SubavFactoring NOT SUPPORTED IN SNOWFLAKE ***/!!!
WITH my_av ANALYTIC VIEW AS
(USING sales_av HIERARCHIES(time_hier) ADD MEASURES(lag_sales AS (LAG(sales) OVER (HIERARCHY time_hier OFFSET 1 ))))
SELECT aValue from my_av;
Práticas recomendadas¶
Se este erro ocorrer, é porque não há um equivalente no Snowflake para o nó que está sendo convertido.
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-EWI-0022¶
Um ou mais identificadores em uma instrução específica são considerados parâmetros por padrão.
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.
Nota
Algumas partes do código de saída foram omitidas por motivos de clareza.
Gravidade¶
Medium
Descrição¶
Este erro é usado para relatar que um ou mais identificadores em uma instrução específica são considerados parâmetros por padrão.
Exemplo de código¶
Código de entrada: ¶
-- Additional Params: -t javascript
CREATE MACRO SAME_MACRO_COLUMN_AND_PARAMATERS (
LOAD_USER_ID (VARCHAR (32), CHARACTER SET LATIN),
UPDATE_USER_ID (VARCHAR (32), CHARACTER SET LATIN)
) AS (
UPDATE TABLE1 SET LOAD_USER_ID = :LOAD_USER_ID, UPDATE_USER_ID = :UPDATE_USER_ID;
INSERT INTO TABLE1 (LOAD_USER_ID, UPDATE_USER_ID) VALUES (:LOAD_USER_ID, :UPDATE_USER_ID);
DELETE FROM TABLE1 WHERE :LOAD_USER_ID = LOAD_USER_ID;
);
Código gerado:¶
-- Additional Params: -t javascript
--** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "TABLE1" **
CREATE OR REPLACE PROCEDURE SAME_MACRO_COLUMN_AND_PARAMATERS (LOAD_USER_ID VARCHAR (32), UPDATE_USER_ID VARCHAR (32))
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "teradata", "convertedOn": "07/16/2025", "domain": "no-domain-provided" }}'
EXECUTE AS CALLER
AS
$$
// REGION SnowConvert AI Helpers Code
var HANDLE_NOTFOUND;
var _RS, ROW_COUNT, _ROWS, MESSAGE_TEXT, SQLCODE = 0, SQLSTATE = '00000', ERROR_HANDLERS, ACTIVITY_COUNT = 0, INTO, _OUTQUERIES = [], DYNAMIC_RESULTS = -1;
var formatDate = (arg) => (new Date(arg - (arg.getTimezoneOffset() * 60000))).toISOString().slice(0,-1);
var fixBind = function (arg) {
arg = arg == undefined ? null : arg instanceof Date ? formatDate(arg) : arg;
return arg;
};
var EXEC = function (stmt,binds,noCatch,catchFunction,opts) {
try {
binds = binds ? binds.map(fixBind) : binds;
_RS = snowflake.createStatement({
sqlText : stmt,
binds : binds
});
_ROWS = _RS.execute();
ROW_COUNT = _RS.getRowCount();
ACTIVITY_COUNT = _RS.getNumRowsAffected();
HANDLE_NOTFOUND && HANDLE_NOTFOUND(_RS);
if (INTO) return {
INTO : function () {
return INTO();
}
};
if (_OUTQUERIES.length < DYNAMIC_RESULTS) _OUTQUERIES.push(_ROWS.getQueryId());
if (opts && opts.temp) return _ROWS.getQueryId();
} catch(error) {
MESSAGE_TEXT = error.message;
SQLCODE = error.code;
SQLSTATE = error.state;
var msg = `ERROR CODE: ${SQLCODE} SQLSTATE: ${SQLSTATE} MESSAGE: ${MESSAGE_TEXT}`;
if (catchFunction) catchFunction(error);
if (!noCatch && ERROR_HANDLERS) ERROR_HANDLERS(error); else throw new Error(msg);
}
};
// END REGION
EXEC(`UPDATE TABLE1
SET
LOAD_USER_ID = :1,
UPDATE_USER_ID = :2`,[LOAD_USER_ID,UPDATE_USER_ID]);
// ** SSC-EWI-0022 - ONE OR MORE IDENTIFIERS IN THIS STATEMENT WERE CONSIDERED PARAMETERS BY DEFAULT. REFERENCED TABLE NOT FOUND. **
EXEC(`INSERT INTO TABLE1 (LOAD_USER_ID, UPDATE_USER_ID)
VALUES (:1, :2)`,[LOAD_USER_ID,UPDATE_USER_ID]);
!!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'Delete' NODE ***/!!!
//DELETE FROM
// TABLE1
//WHERE
// UPPER(RTRIM(:LOAD_USER_ID)) = UPPER(RTRIM(LOAD_USER_ID))
null
$$;
Práticas recomendadas¶
Certifique-se de que todas as dependências (tabelas e exibições) relacionadas à instrução de procedimento estejam sendo migradas.
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-EWI-0023¶
Revisão de desempenho - Um loop contém uma instrução de inserção, exclusão ou atualização.
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.
Nota
Algumas partes do código de saída foram omitidas por motivos de clareza.
Gravidade¶
Low
Descrição¶
Este aviso indica uma possível consideração que o usuário deve ter em termos de desempenho.
Exemplo de código¶
Código de entrada: ¶
-- Additional Params: -t javascript
REPLACE PROCEDURE Database1.Proc1()
BEGIN
DECLARE lNumber INTEGER DEFAULT 1;
FOR class1 AS class2 CURSOR FOR
SELECT COL0,
TRIM(COL1) AS COL1ALIAS,
TRIM(COL2),
COL3
FROM someDb.prefixCol
DO
INSERT INTO TempDB.Table1 (:lgNumber, :lNumber, (',' || :class1.ClassCD || '_Ind CHAR(1) NOT NULL'));
SET lNumber = lNumber + 1;
END FOR;
END;
Código gerado:¶
CREATE OR REPLACE PROCEDURE Database1.Proc1 ()
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
EXECUTE AS CALLER
AS
$$
// SnowConvert AI Helpers Code section is omitted.
var LNUMBER = 1;
/*** SSC-EWI-0023 - PERFORMANCE REVIEW - THIS LOOP CONTAINS AN INSERT, DELETE OR UPDATE STATEMENT ***/
for(var CLASS2 = new CURSOR(`SELECT
COL0,
TRIM(COL1) AS COL1ALIAS,
TRIM(COL2),
COL3
FROM
someDb.prefixCol`,[],false).OPEN();CLASS2.NEXT();) {
let CLASS1 = CLASS2.CURRENT;
EXEC(`INSERT INTO TempDB.Table1
VALUES (:lgNumber, :1, (',' || :
!!!RESOLVE EWI!!! /*** SSC-EWI-0026 - THE VARIABLE class1.ClassCD MAY REQUIRE A CAST TO DATE, TIME OR TIMESTAMP ***/!!!
:2 || '_Ind CHAR(1) NOT NULL'))`,[LNUMBER,CLASS1.CLASSCD]);
LNUMBER = LNUMBER + 1;
}
CLASS2.CLOSE();
$$;
Práticas recomendadas¶
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-EWI-0025¶
As variáveis de tempo de vinculação podem exigir uma alteração na consulta.
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.
Nota
Algumas partes do código de saída foram omitidas por motivos de clareza.
Gravidade¶
Low
Descrição¶
A ação das variáveis de tempo de vinculação pode exigir alterações na consulta que as contém.
Exemplo de código¶
Código de entrada: ¶
-- Additional Params: -t javascript
CREATE PROCEDURE P_1025()
BEGIN
DECLARE LN_EMP_KEY_NO_PARAM NUMERIC DEFAULT -1;
DECLARE FLOATVARNAME FLOAT DEFAULT 12.1;
DECLARE hErrorMsg CHARACTER(30) DEFAULT 'NO ERROR';
DECLARE CurrTs TIME DEFAULT CURRENT_TIME;
DECLARE CurrTs2 TIME DEFAULT CURRENT_TIMESTAMP;
END;
Código gerado:¶
CREATE OR REPLACE PROCEDURE P_1025 ()
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
EXECUTE AS CALLER
AS
$$
// SnowConvert AI Helpers Code section is omitted.
var LN_EMP_KEY_NO_PARAM = -1;
var FLOATVARNAME = 12.1;
var HERRORMSG = `NO ERROR`;
var CURRTS = new Date() /*** SSC-EWI-0025 - BINDING TIME VARIABLE MIGHT REQUIRE CHANGE IN QUERY. ***/;
var CURRTS2 = new Date();
$$;
Práticas recomendadas¶
Não são necessárias ações adicionais do usuário.
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-EWI-0026¶
Variáveis qualificadas podem exigir uma conversão.
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.
Nota
Algumas partes do código de saída foram omitidas por motivos de clareza.
Gravidade¶
Low
Descrição¶
Este aviso é adicionado quando há uma consulta com uma variável com um membro qualificado, como um registro Oracle ou um Teradata, para a variável de loop. Dependendo de onde a variável está sendo usada e do tipo de valor, uma conversão pode ser necessária para funcionar corretamente.
Exemplo de código¶
Código de entrada: ¶
CREATE TABLE TABLE1 (COL1 DATE);
CREATE TABLE TABLE2 (COL1 VARCHAR(25));
CREATE OR REPLACE PROCEDURE EXAMPLE
IS
CURSOR C1 IS SELECT * FROM TABLE1;
BEGIN
FOR REC1 IN C1 LOOP
insert into TABLE2 values (TO_CHAR(REC1.COL1, 'DD-MM-YYYY'));
END LOOP;
END;
Código gerado:¶
-- Additional Params: -t javascript
CREATE OR REPLACE TABLE TABLE1 (COL1 TIMESTAMP /*** SSC-FDM-OR0042 - DATE TYPE COLUMN HAS A DIFFERENT BEHAVIOR IN SNOWFLAKE. ***/
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
;
CREATE OR REPLACE TABLE TABLE2 (COL1 VARCHAR(25))
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
;
CREATE OR REPLACE PROCEDURE EXAMPLE ()
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
// SnowConvert AI Helpers Code section is omitted.
let C1 = new CURSOR(`SELECT * FROM
TABLE1`,() => []);
C1.OPEN();
// ** SSC-EWI-0023 - PERFORMANCE REVIEW - THIS LOOP CONTAINS AN INSERT, DELETE OR UPDATE STATEMENT **
while ( C1.NEXT() ) {
let REC1 = C1.CURRENT;
EXEC(`insert into TABLE2
values (TO_CHAR(
!!!RESOLVE EWI!!! /*** SSC-EWI-0026 - THE VARIABLE REC1.COL1 MAY REQUIRE A CAST TO DATE, TIME OR TIMESTAMP ***/!!!
?, 'DD-MM-YYYY'))`,[REC1.COL1]);
}
C1.CLOSE();
$$;
Código gerado com ajustes: ¶
CREATE OR REPLACE TABLE TABLE1 (COL1 TIMESTAMP
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
;
CREATE OR REPLACE TABLE TABLE2 (COL1 VARCHAR(25))
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
;
CREATE OR REPLACE PROCEDURE EXAMPLE ()
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
// SnowConvert AI Helpers Code section is omitted.
let C1 = new CURSOR(`SELECT * FROM
TABLE1`,() => []);
C1.OPEN();
// ** SSC-EWI-0023 - PERFORMANCE REVIEW - THIS LOOP CONTAINS AN INSERT, DELETE OR UPDATE STATEMENT **
while ( C1.NEXT() ) {
let REC1 = C1.CURRENT;
EXEC(`insert into TABLE2
values (TO_CHAR(REC1.COL1::DATE, 'DD-MM-YYYY'))`,[REC1.COL1]);
}
C1.CLOSE();
$$;
Práticas recomendadas¶
Verifique se uma conversão para uma data, hora ou carimbo de data/hora é necessária para a vinculação. Alguns casos não são necessários porque uma conversão implícita é feita com o valor.
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-EWI-0027¶
A instrução a seguir usa uma variável/literal com uma consulta inválida e não será executada.
Nota
Algumas partes do código de saída foram omitidas por motivos de clareza.
Gravidade¶
Medium
Descrição¶
Este aviso é usado para relatar que uma instrução específica usa uma variável ou literal com uma consulta inválida e, por esse motivo, não será executada.
Exemplo de código¶
Código de entrada: ¶
REPLACE PROCEDURE TEST.COLLECT_STATS ()
BEGIN
COLLECT STATS ON DBC.AccessRights COLUMN(COLNAME);
SET STATS_STATEMENT = 'COLLECT STATS ON ' || OUT_DB || '.' || OUT_TBL || ' COLUMN(' || C4.ColumnName || ');';
EXECUTE IMMEDIATE STATS_STATEMENT;
EXECUTE IMMEDIATE 'COLLECT STATS ON DBC.AccessRights COLUMN(COLNAME);';
SET STATS_STATEMENT_NOT_DYNAMIC = 'COLLECT STATS ON DBC.AccessRights COLUMN(COLNAME);';
EXECUTE IMMEDIATE STATS_STATEMENT_NOT_DYNAMIC;
END;
;
Código gerado:¶
CREATE OR REPLACE PROCEDURE TEST.COLLECT_STATS ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
EXECUTE AS CALLER
AS
$$
BEGIN
-- --** SSC-FDM-0027 - REMOVED NEXT STATEMENT, NOT APPLICABLE IN SNOWFLAKE. COLLECT **
-- COLLECT STATS ON DBC.AccessRights COLUMN(COLNAME);
STATS_STATEMENT := 'COLLECT STATS ON ' || OUT_DB || '.' || OUT_TBL || ' COLUMN(' || C4.ColumnName || ')';
!!!RESOLVE EWI!!! /*** SSC-EWI-0027 - THE FOLLOWING STATEMENT USES A VARIABLE/LITERAL WITH AN INVALID QUERY AND IT WILL NOT BE EXECUTED ***/!!!!!!RESOLVE EWI!!! /*** SSC-EWI-0030 - THE STATEMENT BELOW HAS USAGES OF DYNAMIC SQL. ***/!!!
EXECUTE IMMEDIATE STATS_STATEMENT;
!!!RESOLVE EWI!!! /*** SSC-EWI-0027 - THE FOLLOWING STATEMENT USES A VARIABLE/LITERAL WITH AN INVALID QUERY AND IT WILL NOT BE EXECUTED ***/!!!!!!RESOLVE EWI!!! /*** SSC-EWI-0030 - THE STATEMENT BELOW HAS USAGES OF DYNAMIC SQL. ***/!!!
EXECUTE IMMEDIATE 'COLLECT STATS ON DBC.AccessRights COLUMN(COLNAME)';
STATS_STATEMENT_NOT_DYNAMIC := 'COLLECT STATS ON DBC.AccessRights COLUMN(COLNAME)';
!!!RESOLVE EWI!!! /*** SSC-EWI-0027 - THE FOLLOWING STATEMENT USES A VARIABLE/LITERAL WITH AN INVALID QUERY AND IT WILL NOT BE EXECUTED ***/!!!!!!RESOLVE EWI!!! /*** SSC-EWI-0030 - THE STATEMENT BELOW HAS USAGES OF DYNAMIC SQL. ***/!!!
EXECUTE IMMEDIATE STATS_STATEMENT_NOT_DYNAMIC;
END;
$$;
Práticas recomendadas¶
Verifique se uma conversão para uma data, hora ou carimbo de data/hora é necessária para a vinculação. Alguns casos não são necessários porque uma conversão implícita é feita com o valor.
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-EWI-0028¶
Tipo incompatível com o Snowflake
Gravidade¶
Medium
Descrição¶
Esta mensagem aparece quando um tipo é incompatível com o Snowflake.
Exemplo¶
Código de entrada (Oracle):¶
CREATE TABLE MYTABLE
(
COL1 SYS.ANYDATASET
);
Código gerado:¶
CREATE OR REPLACE TABLE MYTABLE
(
!!!RESOLVE EWI!!! /*** SSC-EWI-0028 - TYPE NOT SUPPORTED BY SNOWFLAKE ***/!!!
COL1 SYS.ANYDATASET
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
;
Práticas recomendadas¶
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-EWI-0029¶
O formato de dados da tabela externa é incompatível com o Snowflake
Gravidade¶
Medium
Descrição¶
O Snowflake é compatível com os seguintes formatos de tabela externa:
BigQuery |
Snowflake |
|---|---|
AVRO |
AVRO |
CSV |
CSV |
NEWLINE_DELIMITED_JSON |
JSON |
ORC |
ORC |
PARQUET |
PARQUET |
Quando uma tabela externa tem outro FORMAT não especificado na tabela acima, este EWI será gerado para informar ao usuário que o FORMAT não é suportado.
Exemplo de código¶
Código de entrada:¶
BigQuery¶
CREATE OR REPLACE EXTERNAL TABLE test.backup_restore_table
OPTIONS (
format = 'DATASTORE_BACKUP',
uris = ['gs://backup_bucket/backup_folder/*']
);
Código gerado:¶
Snowflake¶
!!!RESOLVE EWI!!! /*** SSC-EWI-0029 - EXTERNAL TABLE DATA FORMAT NOT SUPPORTED IN SNOWFLAKE ***/!!!
CREATE OR REPLACE EXTERNAL TABLE test.backup_restore_table USING TEMPLATE (
SELECT
ARRAY_AGG(OBJECT_CONSTRUCT('COLUMN_NAME', COLUMN_NAME, 'TYPE', TYPE, 'NULLABLE', NULLABLE, 'EXPRESSION', EXPRESSION))
FROM
--** SSC-FDM-0035 - THE INFER_SCHEMA FUNCTION REQUIRES A FILE PATH WITHOUT WILDCARDS TO GENERATE THE TABLE TEMPLATE, REPLACE THE FILE_PATH PLACEHOLDER WITH IT **
TABLE(INFER_SCHEMA(LOCATION => '@EXTERNAL_STAGE/FILE_PATH', FILE_FORMAT => 'SC_TEST_BACKUP_RESTORE_TABLE_FORMAT'))
)
!!!RESOLVE EWI!!! /*** SSC-EWI-0032 - EXTERNAL TABLE REQUIRES AN EXTERNAL STAGE TO ACCESS gs://backup_bucket, DEFINE AND REPLACE THE EXTERNAL_STAGE PLACEHOLDER ***/!!!
LOCATION = @EXTERNAL_STAGE
AUTO_REFRESH = false
PATTERN = 'backup_folder/.*'
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "bigquery", "convertedOn": "07/16/2025", "domain": "no-domain-provided" }}';
Práticas recomendadas¶
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-EWI-0030¶
A instrução abaixo tem usos de Dynamic SQL
Nota
Algumas partes do código de saída foram omitidas por motivos de clareza.
Gravidade¶
Medium
Descrição¶
Este erro é usado para indicar que a instrução tem usos de Dynamic SQL. Cada linguagem de origem específica tem seu próprio conjunto de instruções que podem executar Dynamic SQL. Dynamic SQL refere-se ao código criado como texto usando as ferramentas de manipulação de cadeia de caracteres fornecidas pela linguagem do mecanismo de banco de dados.
Este cenário é considerado um padrão complexo porque o Dynamic SQL é criado e executado em tempo de execução, tornando mais difícil rastrear e depurar erros. Este erro pretende ajudar a identificar alguns problemas que um analisador de código estático como o Snow Convert não identifica.
Exemplo de código¶
Teradata¶
Entrada¶
REPLACE PROCEDURE teradata_dynamic_sql()
BEGIN
DECLARE str_sql VARCHAR(20);
SET str_sql = 'UPDATE TABLE
SET COLA = 0,
COLB = ''test''';
EXECUTE IMMEDIATE str_sql;
EXECUTE IMMEDIATE 'INSERT INTO TABLE1(COL1) VALUES(1)';
EXECUTE str_sql;
CALL DBC.SysExecSQL('INSERT INTO TABLE1(COL1) VALUES(1)');
END;
Saída¶
CREATE OR REPLACE PROCEDURE teradata_dynamic_sql ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "teradata", "convertedOn": "07/04/2024" }}'
EXECUTE AS CALLER
AS
$$
DECLARE
str_sql VARCHAR(20);
BEGIN
str_sql := 'UPDATE "TABLE"
SET COLA = 0,
COLB = ''test''';
!!!RESOLVE EWI!!! /*** SSC-EWI-0030 - THE STATEMENT BELOW HAS USAGES OF DYNAMIC SQL. ***/!!!
EXECUTE IMMEDIATE str_sql;
!!!RESOLVE EWI!!! /*** SSC-EWI-0030 - THE STATEMENT BELOW HAS USAGES OF DYNAMIC SQL. ***/!!!
EXECUTE IMMEDIATE 'INSERT INTO TABLE1 (COL1)
VALUES (1);';
!!!RESOLVE EWI!!! /*** SSC-EWI-0030 - THE STATEMENT BELOW HAS USAGES OF DYNAMIC SQL. ***/!!!
EXECUTE IMMEDIATE str_sql;
!!!RESOLVE EWI!!! /*** SSC-EWI-0030 - THE STATEMENT BELOW HAS USAGES OF DYNAMIC SQL. ***/!!!
EXECUTE IMMEDIATE 'INSERT INTO TABLE1 (COL1)
VALUES (1);';
END;
$$;
Oracle¶
Entrada¶
CREATE OR REPLACE PROCEDURE oracle_dynamic_sql
AS
dynamic_statement VARCHAR(100);
numeric_variable INTEGER;
dynamic_statement VARCHAR(100);
column_variable VARCHAR(100);
cursor_variable SYS_REFCURSOR;
c INTEGER;
dynamic_statement VARCHAR(100);
BEGIN
dynamic_statement := 'INSERT INTO sample_table(col1) VALUES(1)';
numeric_variable := 3;
column_variable := 'col1';
EXECUTE IMMEDIATE dynamic_statement;
EXECUTE IMMEDIATE 'INSERT INTO sample_table(col1) VALUES(' || numeric_variable || ')';
OPEN cursor_variable FOR dynamic_statement;
OPEN cursor_variable FOR 'SELECT ' || column_variable || ' FROM sample_table';
OPEN cursor_variable FOR 'SELECT col1 FROM sample_table';
c := DBMS_SQL.OPEN_CURSOR;
dynamic_statement := 'SELECT * FROM sample_table';
DBMS_SQL.PARSE(c, dynamic_statement);
END;
Saída¶
CREATE OR REPLACE PROCEDURE oracle_dynamic_sql ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
DECLARE
dynamic_statement VARCHAR(100);
numeric_variable INTEGER;
dynamic_statement VARCHAR(100);
column_variable VARCHAR(100);
cursor_variable_res RESULTSET;
c INTEGER;
dynamic_statement VARCHAR(100);
BEGIN
dynamic_statement := 'INSERT INTO sample_table(col1) VALUES(1)';
numeric_variable := 3;
column_variable := 'col1';
!!!RESOLVE EWI!!! /*** SSC-EWI-0030 - THE STATEMENT BELOW HAS USAGES OF DYNAMIC SQL. ***/!!!
EXECUTE IMMEDIATE :dynamic_statement;
!!!RESOLVE EWI!!! /*** SSC-EWI-0030 - THE STATEMENT BELOW HAS USAGES OF DYNAMIC SQL. ***/!!!
EXECUTE IMMEDIATE 'INSERT INTO sample_table(col1) VALUES(' || NVL(:numeric_variable :: STRING, '') || ')';
!!!RESOLVE EWI!!! /*** SSC-EWI-0030 - THE STATEMENT BELOW HAS USAGES OF DYNAMIC SQL. ***/!!!
cursor_variable_res := (
EXECUTE IMMEDIATE :dynamic_statement
);
LET cursor_variable CURSOR
FOR
cursor_variable_res;
OPEN cursor_variable;
!!!RESOLVE EWI!!! /*** SSC-EWI-0030 - THE STATEMENT BELOW HAS USAGES OF DYNAMIC SQL. ***/!!!
cursor_variable_res := (
EXECUTE IMMEDIATE 'SELECT ' || NVL(:column_variable :: STRING, '') || ' FROM
sample_table'
);
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0133 - THE CURSOR VARIABLE NAMED 'cursor_variable' HAS ALREADY BEEN ASSIGNED IN ANOTHER CURSOR ***/!!!
LET cursor_variable CURSOR
FOR
cursor_variable_res;
OPEN cursor_variable;
!!!RESOLVE EWI!!! /*** SSC-EWI-0030 - THE STATEMENT BELOW HAS USAGES OF DYNAMIC SQL. ***/!!!
cursor_variable_res := (
EXECUTE IMMEDIATE 'SELECT col1 FROM
sample_table'
);
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0133 - THE CURSOR VARIABLE NAMED 'cursor_variable' HAS ALREADY BEEN ASSIGNED IN ANOTHER CURSOR ***/!!!
LET cursor_variable CURSOR
FOR
cursor_variable_res;
OPEN cursor_variable;
c :=
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0076 - TRANSLATION FOR BUILT-IN PACKAGE 'DBMS_SQL.OPEN_CURSOR' IS NOT CURRENTLY SUPPORTED. ***/!!!
'' AS OPEN_CURSOR;
dynamic_statement := 'SELECT * FROM
sample_table';
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0076 - TRANSLATION FOR BUILT-IN PACKAGE 'DBMS_SQL.PARSE' IS NOT CURRENTLY SUPPORTED. ***/!!!!!!RESOLVE EWI!!! /*** SSC-EWI-0030 - THE STATEMENT BELOW HAS USAGES OF DYNAMIC SQL. ***/!!!
DBMS_SQL.PARSE(:c, :dynamic_statement);
END;
$$;
SQL Server¶
Entrada¶
CREATE OR ALTER PROCEDURE transact_dynamic_sql
AS
BEGIN
DECLARE @dynamicStatement AS VARCHAR(200);
DECLARE @numericVariable AS VARCHAR(200);
SET @dynamicStatement = 'INSERT INTO sample_table(col1) VALUES(1);';
SET @numericVariable = '3';
EXECUTE (@dynamicStatement);
EXEC ('INSERT INTO sampleTable(col1) VALUES (' + @numericVariable + ');');
EXECUTE ('INSERT INTO sampleTable(col1) VALUES(10);') AS USER = 'DbAdmin';
INSERT INTO sampleTable EXECUTE sp_executesql @statement = 'SELECT * FROM sampleTable;';
INSERT INTO sampleTable EXECUTE ('SELECT * FROM sampleTable;');
END;
Saída¶
CREATE OR REPLACE PROCEDURE transact_dynamic_sql ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "transact", "convertedOn": "11/13/2024", "domain": "test" }}'
EXECUTE AS CALLER
AS
$$
DECLARE
DYNAMICSTATEMENT VARCHAR(200);
NUMERICVARIABLE VARCHAR(200);
BEGIN
DYNAMICSTATEMENT := 'INSERT INTO sample_table (col1) VALUES(1);';
NUMERICVARIABLE := '3';
!!!RESOLVE EWI!!! /*** SSC-EWI-0030 - THE STATEMENT BELOW HAS USAGES OF DYNAMIC SQL. ***/!!!
EXECUTE IMMEDIATE :DYNAMICSTATEMENT;
!!!RESOLVE EWI!!! /*** SSC-EWI-0030 - THE STATEMENT BELOW HAS USAGES OF DYNAMIC SQL. ***/!!!
EXECUTE IMMEDIATE 'INSERT INTO sampleTable (col1) VALUES (' || :NUMERICVARIABLE || ');';
!!!RESOLVE EWI!!! /*** SSC-EWI-0030 - THE STATEMENT BELOW HAS USAGES OF DYNAMIC SQL. ***/!!!!!!RESOLVE EWI!!! /*** SSC-EWI-0021 - EXECUTE AS USER/LOGIN NOT SUPPORTED IN SNOWFLAKE ***/!!!
EXECUTE IMMEDIATE 'INSERT INTO sampleTable (col1) VALUES(10);';
!!!RESOLVE EWI!!! /*** SSC-EWI-0030 - THE STATEMENT BELOW HAS USAGES OF DYNAMIC SQL. ***/!!!!!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'INSERT WITH EXECUTE' NODE ***/!!!
INSERT INTO sampleTable EXECUTE IMMEDIATE 'SELECT
*
FROM
sampleTable;';
!!!RESOLVE EWI!!! /*** SSC-EWI-0030 - THE STATEMENT BELOW HAS USAGES OF DYNAMIC SQL. ***/!!!!!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'INSERT WITH EXECUTE' NODE ***/!!!
INSERT INTO sampleTable EXECUTE IMMEDIATE 'SELECT
*
FROM
sampleTable;';
END;
$$;
Problemas no SQL dinâmico¶
Algo importante a ter em conta é que, ao migrar código Dynamic SQL, o SnowConvert AI não relatará nenhum tipo de problema dentro do Dynamic SQL no código de saída ou nos relatórios de avaliação. Isto acontecerá mesmo quando a documentação de um problema ou a especificação da tradução descrever que um problema sempre será adicionado ao código de saída. Aqui está um exemplo de uma migração no Oracle onde esta situação pode ser encontrada:
Oracle¶
SELECT dbms_random.value() FROM dual;
CREATE OR REPLACE PROCEDURE dynamic_sql_procedure
AS
result VARCHAR(100) := 'SELECT dbms_random.value() from dual';
BEGIN
NULL;
END;
Snowflake¶
SELECT
--** SSC-FDM-OR0033 - DBMS_RANDOM.VALUE DIGITS OF PRECISION ARE LOWER IN SNOWFLAKE **
DBMS_RANDOM.VALUE_UDF() FROM dual;
CREATE OR REPLACE PROCEDURE dynamic_sql_procedure ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
DECLARE
result VARCHAR(100) := 'SELECT
DBMS_RANDOM.VALUE_UDF() from dual';
BEGIN
NULL;
END;
$$;
No exemplo anterior, a consulta e a atribuição de variável dentro do procedimento serão convertidas exatamente da mesma forma; a diferença é que, no código Dynamic SQL, os problemas de conversão não serão mostrados no código de saída e nos relatórios de avaliação.
Práticas recomendadas¶
Use esta tag para rastrear cada instrução criada dinamicamente e revisar sua correção ao solucionar problemas.
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-EWI-0031¶
Função não incompatível.
Nota
Algumas partes do código de saída foram omitidas por motivos de clareza.
Severidade ¶
Medium
Descrição ¶
Este aviso é usado para relatar que uma função interna específica do Teradata, Oracle ou SQL Server é incompatível.
Código de exemplo ¶
Código de entrada (Oracle):¶
SELECT VALUE(ST) FROM SampleTable ST;
Código de saída: ¶
// SnowConvert AI Helpers Code section is omitted.
SELECT
!!!RESOLVE EWI!!! /*** SSC-EWI-0031 - VALUE FUNCTION NOT SUPPORTED ***/!!!
VALUE(ST) FROM
SampleTable ST;
Práticas recomendadas ¶
Consulte os links a seguir para verificar a transformação atual da função específica que você está tentando converter:
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-EWI-0032¶
A tabela externa requer um estágio externo para acessar uma localização externa, definir e substituir o espaço reservado EXTERNAL_STAGE
Descrição¶
Ao transformar a instrução CREATE EXTERNAL TABLE, o SnowConvert AI vai gerar um espaço reservado EXTERNAL_STAGE, que precisa ser substituído pela área de preparação externa criada para conexão com a localização externa pelo Snowflake.
Consulte os seguintes guias para configurar a integração de armazenamento e a área de preparação externa necessários em sua conta Snowflake:
Para tabelas externas que fazem referência ao Google Cloud Storage
Para tabelas externas que fazem referência ao Armazenamento de blobs Azure
Exemplo de código¶
Código de entrada:¶
BigQuery¶
CREATE OR REPLACE EXTERNAL TABLE test.Employees_test
(
Employee_id INTEGER,
Name STRING,
Mail STRING,
Position STRING,
Salary INTEGER
)
OPTIONS(
FORMAT='CSV',
SKIP_LEADING_ROWS=1,
URIS=['gs://sc_external_table_bucket/folder_with_csv/Employees.csv']
);
Código gerado:¶
Snowflake¶
CREATE OR REPLACE EXTERNAL TABLE test.Employees_test
(
Employee_id INTEGER AS CAST(GET_IGNORE_CASE($1, 'c1') AS INTEGER),
Name STRING AS CAST(GET_IGNORE_CASE($1, 'c2') AS STRING),
Mail STRING AS CAST(GET_IGNORE_CASE($1, 'c3') AS STRING),
Position STRING AS CAST(GET_IGNORE_CASE($1, 'c4') AS STRING),
Salary INTEGER AS CAST(GET_IGNORE_CASE($1, 'c5') AS INTEGER)
)
!!!RESOLVE EWI!!! /*** SSC-EWI-0032 - EXTERNAL TABLE REQUIRES AN EXTERNAL STAGE TO ACCESS gs://sc_external_table_bucket, DEFINE AND REPLACE THE EXTERNAL_STAGE PLACEHOLDER ***/!!!
LOCATION = @EXTERNAL_STAGE
AUTO_REFRESH = false
PATTERN = 'folder_with_csv/Employees.csv'
FILE_FORMAT = (TYPE = CSV SKIP_HEADER =1);
Práticas recomendadas¶
Configure sua conexão externa na conta Snowflake e substitua o espaço reservado EXTERNAL_STAGE para concluir a transformação.
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-EWI-0033¶
Formato removido, informações semânticas não encontradas.
Nota
Algumas partes do código de saída foram omitidas por motivos de clareza.
Gravidade¶
Low
Descrição¶
Este aviso aparece quando uma coluna usada em uma função CAST com um formato de saída específico não foi encontrada no código-fonte.
Exemplo de código¶
Código de entrada (Teradata):¶
CREATE VIEW SampleView AS
SELECT
DAY_DATE(FORMAT 'MMM-YYYY')(CHAR(8))
FROM
SampleTable;
Código gerado: ¶
// SnowConvert AI Helpers Code section is omitted.
CREATE OR REPLACE VIEW SampleView
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
AS
SELECT
CAST(RPAD(TO_VARCHAR(
DAY_DATE !!!RESOLVE EWI!!! /*** SSC-EWI-0033 - FORMAT 'MMM-YYYY' REMOVED, SEMANTIC INFORMATION NOT FOUND. ***/!!!), 8) AS CHAR(8))
FROM
SampleTable;
Práticas recomendadas¶
Certifique-se de que todas as dependências (tabelas e exibições) relacionadas à instrução de procedimento estejam sendo migradas.
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-EWI-0034¶
Formato removido.
Nota
Algumas partes do código de saída foram omitidas por motivos de clareza.
Gravidade¶
Low
Descrição¶
Este aviso aparece quando o formato da coluna usada em uma função CAST é removido.
Exemplo de código¶
Código de entrada (Teradata):¶
CREATE VIEW SampleView AS
SELECT
DAY_DATE(FORMAT 'MMM-YYYY') + 1
FROM
SampleTable;
Código gerado: ¶
// SnowConvert AI Helpers Code section is omitted.
CREATE OR REPLACE VIEW SampleView
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"teradata"}}'
AS
SELECT
DAY_DATE !!!RESOLVE EWI!!! /*** SSC-EWI-0034 - FORMAT 'MMM-YYYY' REMOVED. ***/!!! + 1
FROM
SampleTable;
Práticas recomendadas¶
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-EWI-0035¶
Instrução Check incompatível.
Nota
Algumas partes do código de saída foram omitidas por motivos de clareza.
Gravidade¶
Low
Descrição¶
A restrição CHECK não é compatível com o Snowflake, mas não o afeta funcionalmente.
Exemplo de código¶
Código de entrada Oracle:¶
CREATE TABLE "Schema"."BaseTable"(
"COLUMN1" VARCHAR2(255),
CHECK ( COLUMN1 IS NOT NULL )
);
Código gerado: ¶
CREATE OR REPLACE TABLE "Schema"."BaseTable" (
"COLUMN1" VARCHAR(255),
!!!RESOLVE EWI!!! /*** SSC-EWI-0035 - CHECK STATEMENT NOT SUPPORTED ***/!!!
CHECK ( COLUMN1 IS NOT NULL )
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
;
Código de entrada do Teradata: ¶
CREATE TABLE TABLE1,
NO FALLBACK,
NO BEFORE JOURNAL,
NO AFTER JOURNAL
(
COL0 BYTEINT,
CONSTRAINT constraint_name CHECK (COL1 < COL2)
)
Código gerado: ¶
CREATE OR REPLACE TABLE TABLE1
(
COL0 BYTEINT,
!!!RESOLVE EWI!!! /*** SSC-EWI-0035 - CHECK STATEMENT NOT SUPPORTED ***/!!!
CONSTRAINT constraint_name CHECK (COL1 < COL2)
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"teradata"}}'
;
Código de entrada SqlServer¶
ALTER TABLE table_name2
ADD column_name VARCHAR(255)
CONSTRAINT constraint_name
CHECK NOT FOR REPLICATION (column_name > 1);
Código gerado:¶
ALTER TABLE IF EXISTS table_name2
ADD column_name VARCHAR(255)
!!!RESOLVE EWI!!! /*** SSC-EWI-0035 - CHECK STATEMENT NOT SUPPORTED ***/!!!
CONSTRAINT constraint_name
CHECK NOT FOR REPLICATION (column_name > 1);
Práticas recomendadas¶
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-EWI-0036¶
Tipo de dados convertido em outro tipo de dados.
Gravidade¶
Low
Descrição¶
Este aviso aparece quando um tipo de dados é alterado para outro.
Exemplo de código¶
Código-fonte:¶
CREATE TABLE SampleTable (
SampleYear INTERVAL YEAR(2),
SampleMonth INTERVAL MONTH(2)
);
Código convertido: ¶
CREATE OR REPLACE TABLE SampleTable (
SampleYear VARCHAR(21) !!!RESOLVE EWI!!! /*** SSC-EWI-0036 - INTERVAL YEAR(2) DATA TYPE CONVERTED TO VARCHAR ***/!!!,
SampleMonth VARCHAR(21) !!!RESOLVE EWI!!! /*** SSC-EWI-0036 - INTERVAL MONTH(2) DATA TYPE CONVERTED TO VARCHAR ***/!!!
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "teradata", "convertedOn": "07/23/2024" }}'
;
Práticas recomendadas¶
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-EWI-0040¶
Cláusula incompatível.
Nota
Algumas partes do código de saída foram omitidas por motivos de clareza.
Gravidade¶
Low
Descrição¶
Este aviso é adicionado quando há uma instrução que não é compatível com o SnowFlake.
Exemplo de código¶
No exemplo a seguir, a cláusula PERCENT do SQL Server é usado na consulta SELECT, o que não é compatível com o Snowflake.
Código de entrada (SQL Server):¶
SELECT TOP 1 PERCENT * FROM SampleTable;
Código-fonte: ¶
// SnowConvert AI Helpers Code section is omitted.
SELECT
TOP 1 !!!RESOLVE EWI!!! /*** SSC-EWI-0040 - THE 'TOP PERCENT' CLAUSE IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
*
FROM
SampleTable;
Práticas recomendadas¶
Revise a funcionalidade original da instrução e verifique se ela é realmente necessária para suas necessidades específicas no Snowflake.
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-EWI-0041¶
O arquivo tem uma codificação inesperada e não foi traduzido
Nota
Este EWI está obsoleto; consulte a documentação SSC-OOS-0001.
Descrição¶
Este problema acontece quando um arquivo de código-fonte tem um formato de codificação não reconhecido pela ferramenta. A codificação de caracteres é o processo de atribuição de números a caracteres gráficos. Neste contexto, caracteres escritos de linguagem humana, assim o erro indica que a ferramenta de conversão não conseguiu reconhecer certos caracteres.
Práticas recomendadas¶
Todos os arquivos na pasta de entrada devem ter a mesma codificação para evitar esse erro.
A codificação apropriada deve ser selecionada por meio das configurações de conversão ou utilizando o parâmetro de conversão –encoding com a CLI. Para determinar qual codificação selecionar ferramentas online como o Free Online Formater podem ser usadas ou execute o comando
file -i *no caso de Linux ou OS.Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-EWI-0045¶
O nome da coluna é Snowflake Reserved Keyword.
Gravidade¶
Medium
Descrição¶
Em alguns casos, nomes de colunas válidos na linguagem de origem podem entrar em conflito com as palavras-chave reservadas do Snowflake. Esses conflitos ocorrem porque o Snowflake reserva um conjunto de palavras-chave que não podem ser usadas diretamente como nomes de colunas sem tratamento especial. Para obter mais detalhes, consulte a documentação oficial do Snowflake sobre palavras-chave reservadas e limitadas.
Exemplo de código¶
Entrada¶
CREATE TABLE T1
(
LOCALTIME VARCHAR,
CURRENT_USER VARCHAR
);
Saída¶
CREATE OR REPLACE TABLE T1
(
!!!RESOLVE EWI!!! /*** SSC-EWI-0045 - COLUMN NAME 'LOCALTIME' IS A SNOWFLAKE RESERVED KEYWORD ***/!!!
"LOCALTIME" VARCHAR,
!!!RESOLVE EWI!!! /*** SSC-EWI-0045 - COLUMN NAME 'CURRENT_USER' IS A SNOWFLAKE RESERVED KEYWORD ***/!!!
"CURRENT_USER" VARCHAR
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
;
Práticas recomendadas¶
Considere renomear as colunas que usam nomes incompatíveis com o Snowflake.
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-EWI-0046¶
As declarações de funções/procedimentos aninhados são consideradas um padrão complexo e incompatível com o Snowflake.
Gravidade¶
Crítico
Descrição¶
Como o Snowflake não é compatível com a declaração de funções/procedimentos aninhados, este aviso é adicionado a qualquer instrução para criar função ou procedimento na qual foram encontradas declarações aninhadas.
Exemplo de código¶
Entrada¶
CREATE OR REPLACE FUNCTION myFunction
RETURN INTEGER
IS
total_count INTEGER;
-- Function Declaration
FUNCTION function_declaration(param1 VARCHAR) RETURN INTEGER;
FUNCTION function_definition
RETURN INTEGER
IS
count INTEGER;
PROCEDURE procedure_declaration(param1 INTEGER)
IS
BEGIN
NULL;
END;
BEGIN
RETURN count;
end;
BEGIN
-- Your logic to calculate the total employee count goes here
RETURN total_count;
END;
Saída¶
!!!RESOLVE EWI!!! /*** SSC-EWI-0046 - NESTED FUNCTION/PROCEDURE DECLARATIONS ARE NOT SUPPORTED IN SNOWFLAKE. ***/!!!
CREATE OR REPLACE FUNCTION myFunction ()
RETURNS FLOAT
LANGUAGE JAVASCRIPT
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "oracle", "convertedOn": "12/16/2024", "domain": "test" }}'
AS
$$
let TOTAL_COUNT;
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0057 - TRANSFORMATION FOR NESTED FUNCTION IS NOT SUPPORTED IN THIS SCENARIO ***/!!!
/* -- Function Declaration
FUNCTION function_declaration(param1 VARCHAR) RETURN INTEGER; */
// Function Declaration
;
!!!RESOLVE EWI!!! /*** SSC-EWI-OR0057 - TRANSFORMATION FOR NESTED FUNCTION IS NOT SUPPORTED IN THIS SCENARIO ***/!!!
/* FUNCTION function_definition
RETURN INTEGER
IS
count INTEGER;
PROCEDURE procedure_declaration(param1 INTEGER)
IS
BEGIN
NULL;
END;
BEGIN
RETURN count;
end; */
;
// Your logic to calculate the total employee count goes here
return TOTAL_COUNT;
$$;
Práticas recomendadas¶
Remova as declarações aninhadas da função/procedimento.
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-EWI-0049¶
Uma tabela temporária global está sendo referenciada.
Nota
Este EWI está obsoleto, consulte a documentação SSC-FDM-0023.
Gravidade¶
Medium
Descrição¶
O SnowConvert AI transforma tabelas temporárias globais em funções de criação de tabela regulares. As referências a estas tabelas podem se comportar de forma diferente do esperado.
Exemplo de código¶
Entrada¶
create global temporary table t1
(col1 varchar);
create view view1 as
select col1 from t1;
Saída¶
--** SSC-FDM-0009 - GLOBAL TEMPORARY TABLE FUNCTIONALITY NOT SUPPORTED. **
CREATE OR REPLACE TABLE t1
(col1 varchar)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
;
CREATE OR REPLACE VIEW view1
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
AS
select col1 from
!!!RESOLVE EWI!!! /*** SSC-EWI-0049 - A Global Temporary Table is being referenced ***/!!!
t1;
Práticas recomendadas¶
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-EWI-0052¶
Objeto inutilizável
Gravidade¶
Medium
Descrição¶
Este erro acontece quando o código-fonte usa um parâmetro ou variável incompatível ou não reconhecido pela ferramenta de conversão.
Exemplo de código¶
Código de entrada (Oracle):¶
-- Additional Params: -t JavaScript
CREATE OR REPLACE PROCEDURE PROCEDURE_PARAMETERS(PARAM SDO_GEOMETRY)
AS
VARIABLE SDO_GEOMETRY;
BEGIN
VARIABLE := PARAM;
END;
Código gerado:¶
CREATE OR REPLACE PROCEDURE PROCEDURE_PARAMETERS (PARAM GEOMETRY)
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
// REGION SnowConvert AI Helpers Code
var formatDate = (arg) => (new Date(arg - (arg.getTimezoneOffset() * 60000))).toISOString().slice(0,-1);
var fixBind = function (arg) {
arg = arg instanceof Date ? formatDate(arg) : IS_NULL(arg) ? null : arg;
return arg;
};
var SQL = {
FOUND : false,
NOTFOUND : false,
ROWCOUNT : 0,
ISOPEN : false
};
var _RS, _ROWS, SQLERRM = "normal, successful completion", SQLCODE = 0;
var getObj = (_rs) => Object.assign(new Object(),_rs);
var getRow = (_rs) => (values = Object.values(_rs)) && (values = values.splice(-1 * _rs.getColumnCount())) && values;
var fetch = (_RS,_ROWS,fmode) => _RS.getRowCount() && _ROWS.next() && (fmode ? getObj : getRow)(_ROWS) || (fmode ? new Object() : []);
var EXEC = function (stmt,binds,opts) {
try {
binds = !(arguments[1] instanceof Array) && ((opts = arguments[1]) && []) || (binds || []);
opts = opts || new Object();
binds = binds ? binds.map(fixBind) : binds;
_RS = snowflake.createStatement({
sqlText : stmt,
binds : binds
});
_ROWS = _RS.execute();
if (opts.sql !== 0) {
var isSelect = stmt.toUpperCase().trimStart().startsWith("SELECT");
var affectedRows = isSelect ? _RS.getRowCount() : _RS.getNumRowsAffected();
SQL.FOUND = affectedRows != 0;
SQL.NOTFOUND = affectedRows == 0;
SQL.ROWCOUNT = affectedRows;
}
if (opts.row === 2) {
return _ROWS;
}
var INTO = function (opts) {
if (opts.vars == 1 && _RS.getColumnCount() == 1 && _ROWS.next()) {
return _ROWS.getColumnValue(1);
}
if (opts.rec instanceof Object && _ROWS.next()) {
var recordKeys = Object.keys(opts.rec);
Object.assign(opts.rec,Object.fromEntries(new Map(getRow(_ROWS).map((element,Index) => [recordKeys[Index],element]))))
return opts.rec;
}
return fetch(_RS,_ROWS,opts.row);
};
var BULK_INTO_COLLECTION = function (into) {
for(let i = 0;i < _RS.getRowCount();i++) {
FETCH_INTO_COLLECTIONS(into,fetch(_RS,_ROWS,opts.row));
}
return into;
};
if (_ROWS.getRowCount() > 0) {
return _ROWS.getRowCount() == 1 ? INTO(opts) : BULK_INTO_COLLECTION(opts);
}
} catch(error) {
RAISE(error.code,error.name,error.message)
}
};
var RAISE = function (code,name,message) {
message === undefined && ([name,message] = [message,name])
var error = new Error(message);
error.name = name
SQLERRM = `${(SQLCODE = (error.code = code))}: ${message}`
throw error;
};
var FETCH_INTO_COLLECTIONS = function (collections,fetchValues) {
for(let i = 0;i < collections.length;i++) {
collections[i].push(fetchValues[i]);
}
};
var IS_NULL = (arg) => !(arg || arg === 0);
// END REGION
let VARIABLE = new SDO_GEOMETRY();
VARIABLE =
!!!RESOLVE EWI!!! /*** SSC-EWI-0052 - UNUSABLE OBJECT PARAM, ITS DATATYPE WAS NOT TRANSFORMED ***/!!!
PARAM;
$$;
Práticas recomendadas¶
Procure uma alternativa para o tipo de dados usado.
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-EWI-0053¶
O objeto pode não funcionar.
Gravidade¶
Low
Descrição¶
Esse erro acontece quando a ferramenta de conversão não conseguiu determinar o tipo de dados de uma variável. Isto pode acontecer porque a declaração de uma variável pode estar faltando.
Exemplo de código¶
Código de entrada (Oracle):¶
-- Additional Params: -t javascript
CREATE OR REPLACE PROCEDURE PROCEDURE_VARIABLES
AS
VARIABLE INTEGER;
BEGIN
VARIABLE := ANOTHER_VARIABLE;
END;
Código gerado:¶
CREATE OR REPLACE PROCEDURE PROCEDURE_VARIABLES ()
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
// REGION SnowConvert AI Helpers Code
var formatDate = (arg) => (new Date(arg - (arg.getTimezoneOffset() * 60000))).toISOString().slice(0,-1);
var fixBind = function (arg) {
arg = arg instanceof Date ? formatDate(arg) : IS_NULL(arg) ? null : arg;
return arg;
};
var SQL = {
FOUND : false,
NOTFOUND : false,
ROWCOUNT : 0,
ISOPEN : false
};
var _RS, _ROWS, SQLERRM = "normal, successful completion", SQLCODE = 0;
var getObj = (_rs) => Object.assign(new Object(),_rs);
var getRow = (_rs) => (values = Object.values(_rs)) && (values = values.splice(-1 * _rs.getColumnCount())) && values;
var fetch = (_RS,_ROWS,fmode) => _RS.getRowCount() && _ROWS.next() && (fmode ? getObj : getRow)(_ROWS) || (fmode ? new Object() : []);
var EXEC = function (stmt,binds,opts) {
try {
binds = !(arguments[1] instanceof Array) && ((opts = arguments[1]) && []) || (binds || []);
opts = opts || new Object();
binds = binds ? binds.map(fixBind) : binds;
_RS = snowflake.createStatement({
sqlText : stmt,
binds : binds
});
_ROWS = _RS.execute();
if (opts.sql !== 0) {
var isSelect = stmt.toUpperCase().trimStart().startsWith("SELECT");
var affectedRows = isSelect ? _RS.getRowCount() : _RS.getNumRowsAffected();
SQL.FOUND = affectedRows != 0;
SQL.NOTFOUND = affectedRows == 0;
SQL.ROWCOUNT = affectedRows;
}
if (opts.row === 2) {
return _ROWS;
}
var INTO = function (opts) {
if (opts.vars == 1 && _RS.getColumnCount() == 1 && _ROWS.next()) {
return _ROWS.getColumnValue(1);
}
if (opts.rec instanceof Object && _ROWS.next()) {
var recordKeys = Object.keys(opts.rec);
Object.assign(opts.rec,Object.fromEntries(new Map(getRow(_ROWS).map((element,Index) => [recordKeys[Index],element]))))
return opts.rec;
}
return fetch(_RS,_ROWS,opts.row);
};
var BULK_INTO_COLLECTION = function (into) {
for(let i = 0;i < _RS.getRowCount();i++) {
FETCH_INTO_COLLECTIONS(into,fetch(_RS,_ROWS,opts.row));
}
return into;
};
if (_ROWS.getRowCount() > 0) {
return _ROWS.getRowCount() == 1 ? INTO(opts) : BULK_INTO_COLLECTION(opts);
}
} catch(error) {
RAISE(error.code,error.name,error.message)
}
};
var RAISE = function (code,name,message) {
message === undefined && ([name,message] = [message,name])
var error = new Error(message);
error.name = name
SQLERRM = `${(SQLCODE = (error.code = code))}: ${message}`
throw error;
};
var FETCH_INTO_COLLECTIONS = function (collections,fetchValues) {
for(let i = 0;i < collections.length;i++) {
collections[i].push(fetchValues[i]);
}
};
var IS_NULL = (arg) => !(arg || arg === 0);
// END REGION
let VARIABLE;
VARIABLE =
!!!RESOLVE EWI!!! /*** SSC-EWI-0053 - OBJECT ANOTHER_VARIABLE MAY NOT WORK PROPERLY, ITS DATATYPE WAS NOT RECOGNIZED ***/!!!
ANOTHER_VARIABLE;
$$;
Práticas recomendadas¶
Certifique-se de que o código de entrada tenha a variável declarada.
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-EWI-0054¶
Subconsulta de junção externa incompatível
Nota
Algumas partes do código de saída foram omitidas por motivos de clareza.
Gravidade¶
Low
Descrição¶
Este erro acontece quando uma subconsulta correlacionada é encontrada em uma expressão lógica OR de uma OUTER JOIN (Left, Right ou Full). Nestes casos, elas podem produzir resultados inconsistentes ou causar o seguinte erro:
Erro de compilação do SQL: Não é possível avaliar o tipo de subconsulta incompatível.
Estas limitações com subconsultas são mencionadas na Documentação do Snowflake e algumas informações sobre elas também podem ser encontradas em fóruns do Snowflake.
Exemplo de código¶
Código de entrada (Teradata):¶
SELECT a.Column1, b.Column2
FROM
TableA a
LEFT JOIN TableB b ON (a.Column1 = b.Column1)
AND (
a.Column2 = b.Column2
OR EXISTS(
SELECT * FROM Table3 c
WHERE c.Column1 = a.Column1
)
);
Código gerado:¶
// SnowConvert AI Helpers Code section is omitted.
SELECT
a.Column1,
b.Column2
FROM
TableA a
LEFT JOIN
TableB b ON (a.Column1 = b.Column1)
AND (
a.Column2 = b.Column2
OR EXISTS
!!!RESOLVE EWI!!! /*** SSC-EWI-0054 - CORRELATED SUBQUERIES WITHIN AN OR EXPRESSION OF AN OUTER JOIN COULD CAUSE COMPILATION ERRORS ***/!!!(
SELECT
* FROM
Table3 c
WHERE c.Column1 = a.Column1
)
);
Práticas recomendadas¶
Verifique se o código de saída não produz um erro de compilação.
Verifique a equivalência funcional do código de saída.
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-EWI-0056¶
Criação de tipo sem suporte
Gravidade¶
Low
Descrição¶
Esta mensagem aparece quando um tipo personalizado transformável é definido, para adicionar feedback sobre os tipos personalizados transformáveis que estão sendo comentados.
Nota
A definição de tipo é colocada como comentário, mas ainda está sendo levada em conta para a resolução de usos. Consulte SSC-EWI-0062 para obter mais informações.
Exemplo de código¶
Código de entrada (Oracle):¶
CREATE TYPE type1 AS OBJECT (column1 INT);
CREATE OR REPLACE PROCEDURE record_procedure
IS
TYPE record_typ IS RECORD(col1 INTEGER, col2 FLOAT);
BEGIN
NULL;
END;
Código gerado:¶
!!!RESOLVE EWI!!! /*** SSC-EWI-0056 - CUSTOM TYPES ARE NOT SUPPORTED IN SNOWFLAKE BUT REFERENCES TO THIS CUSTOM TYPE WERE CHANGED TO VARIANT ***/!!!
CREATE TYPE type1 AS OBJECT (column1 INT)
;
CREATE OR REPLACE PROCEDURE record_procedure ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
DECLARE
!!!RESOLVE EWI!!! /*** SSC-EWI-0056 - CUSTOM TYPES ARE NOT SUPPORTED IN SNOWFLAKE BUT REFERENCES TO THIS CUSTOM TYPE WERE CHANGED TO OBJECT ***/!!!
TYPE record_typ IS RECORD(col1 INTEGER, col2 FLOAT);
BEGIN
NULL;
END;
$$;
Práticas recomendadas¶
Nenhuma ação do usuário final é necessária.
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-EWI-0058¶
A funcionalidade é atualmente incompatível com o Script Snowflake
Gravidade¶
Medium
Descrição¶
Este erro acontece quando uma instrução usada em um procedimento de criação é atualmente incompatível com o Script Snowflake.
Exemplo de código¶
Código de entrada (Oracle):¶
CREATE OR REPLACE PROCEDURE PROC01
IS
number_variable INTEGER;
BEGIN
EXECUTE IMMEDIATE 'SELECT 1 FROM DUAL' INTO number_variable;
END;
Código gerado:¶
CREATE OR REPLACE PROCEDURE PROC01 ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
DECLARE
number_variable INTEGER;
BEGIN
!!!RESOLVE EWI!!! /*** SSC-EWI-0030 - THE STATEMENT BELOW HAS USAGES OF DYNAMIC SQL. ***/!!!
EXECUTE IMMEDIATE 'SELECT 1 FROM DUAL'
!!!RESOLVE EWI!!! /*** SSC-EWI-0058 - FUNCTIONALITY FOR 'EXECUTE IMMEDIATE RETURNING CLAUSE' IS NOT CURRENTLY SUPPORTED BY SNOWFLAKE SCRIPTING ***/!!!
INTO number_variable;
END;
$$;
Práticas recomendadas¶
Nenhuma ação do usuário final é necessária.
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-EWI-0062¶
Uso de tipo personalizado alterado para variante
Gravidade¶
Low
Descrição¶
Esta mensagem aparece quando um tipo personalizado é referenciado e, então, seu uso é alterado para uma variante.
Nota
Esta mensagem está fortemente relacionada ao SSC-EWI-0056.
Exemplo de código¶
Código de entrada (Oracle):¶
CREATE TYPE type1 AS OBJECT(type1_column1 INT);
CREATE TABLE table1
(
column1 type1
);
Código gerado:¶
!!!RESOLVE EWI!!! /*** SSC-EWI-0056 - CUSTOM TYPES ARE NOT SUPPORTED IN SNOWFLAKE BUT REFERENCES TO THIS CUSTOM TYPE WERE CHANGED TO VARIANT ***/!!!
CREATE TYPE type1 AS OBJECT(type1_column1 INT)
;
CREATE OR REPLACE TABLE table1
(
column1 VARIANT !!!RESOLVE EWI!!! /*** SSC-EWI-0062 - CUSTOM TYPE 'type1' USAGE CHANGED TO VARIANT ***/!!!
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "oracle", "convertedOn": "07/14/2025", "domain": "no-domain-provided" }}'
;
CREATE OR REPLACE VIEW table1_view
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "oracle", "convertedOn": "07/14/2025", "domain": "no-domain-provided" }}'
AS
SELECT
column1:type1_column1 :: VARCHAR AS type1_column1
FROM
table1;
Práticas recomendadas¶
Lembre-se de transformar todos os dados de entrada em um tipo de dados compatível com Variant também.
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com.
SSC-EWI-0064¶
Tipo personalizado referenciado na consulta não encontrado
Gravidade¶
High
Descrição¶
Este erro acontece quando um tipo personalizado é referenciado em uma fonte para uma instrução DML, mas o tipo personalizado nunca foi definido.\ Por exemplo, em uma coluna de tabela cujo tipo pode ser um UDT, mas ele nunca foi definido.
Aviso
Não deve ser confundido com SSC-FDM-0015, quando foi referenciado em uma consulta DDL.
Exemplo de código¶
Código de entrada (Oracle):¶
--Type was never defined
--CREATE TYPE type1;
CREATE TABLE table1
(
--the type will be unresolved
column1 type1
);
SELECT
column1
FROM table1;
Código gerado:¶
--Type was never defined
--CREATE TYPE type1;
!!!RESOLVE EWI!!! /*** SSC-EWI-0050 - MISSING DEPENDENT OBJECT "type1" ***/!!!!!!RESOLVE EWI!!! /*** SSC-EWI-0063 - 'PUBLIC.table1_view' ADDED BECAUSE 'table1' USED A CUSTOM TYPE ***/!!!
CREATE OR REPLACE TABLE table1
(
--the type will be unresolved
column1 VARIANT !!!RESOLVE EWI!!! /*** SSC-EWI-0064 - REFERENCED CUSTOM TYPE 'type1' IN QUERY NOT FOUND, USAGES MAY BE AFFECTED ***/!!! /*** SSC-FDM-0015 - DATA TYPE 'type1' NOT RECOGNIZED ***/
);
CREATE OR REPLACE VIEW PUBLIC.table1_view
AS
SELECT
column1
FROM
table1;
SELECT
column1 !!!RESOLVE EWI!!! /*** SSC-EWI-0064 - REFERENCED CUSTOM TYPE 'type1' IN QUERY NOT FOUND, USAGES MAY BE AFFECTED ***/!!!
FROM
table1;
Práticas recomendadas¶
Verifique se o tipo referenciado foi definido no código de entrada.
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-EWI-0066¶
Expressão incompatível no Snowflake.
Severidade ¶
High
Descrição ¶
Este erro é usado para informar que uma expressão específica não é compatível com Snowflake.
Código de exemplo ¶
Código de entrada:¶
SELECT * from T1 where (cast('2016-03-17' as DATE),
cast('2016-03-21' as DATE)) OVERLAPS
(cast('2016-03-20' as DATE), cast('2016-03-22' as DATE));
Código de saída: ¶
SELECT * from
T1
where
!!!RESOLVE EWI!!! /*** SSC-EWI-0066 - EXPRESSION 'OVERLAPS' IS NOT SUPPORTED IN SNOWFLAKE. ***/!!! (cast('2016-03-17' as DATE),
cast('2016-03-21' as DATE)) OVERLAPS
(cast('2016-03-20' as DATE), cast('2016-03-22' as DATE));
Práticas recomendadas ¶
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-EWI-0067¶
A UDF foi transformada em procedimento do Snowflake; não há suporte para chamar procedimentos dentro de uma consulta.
Gravidade¶
High
Descrição¶
Esse erro é adicionado quando uma chamada a uma UDF (função definida pelo usuário) é encontrada dentro de uma consulta. UDFs do Oracle e UDFs dentro de pacotes e algumas UDFs do SQL Server, estão sendo transformadas em procedimentos armazenados do Snowflake, que não podem ser chamados de uma consulta.
A função é transformada em um procedimento armazenado para manter a equivalência funcional e a chamada de função é transformada em uma função vazia da UDF do Snowflake.
Nota
Este EWI está fortemente relacionado a SSC-EWI-0068
Exemplo de código¶
SQL Server:¶
Código de entrada¶
CREATE OR ALTER FUNCTION PURCHASING.FOO()
RETURNS INT
AS
BEGIN
DECLARE @i int = 0, @p int;
Select @p = COUNT(*) FROM PURCHASING.VENDOR
WHILE (@p < 1000)
BEGIN
SET @i = @i + 1
SET @p = @p + @i
END
IF (@i = 6)
RETURN 1
RETURN @p
END;
GO
SELECT PURCHASING.FOO() AS RESULT;
Código gerado¶
!!!RESOLVE EWI!!! /*** SSC-EWI-0068 - USER DEFINED FUNCTION WAS TRANSFORMED TO SNOWFLAKE PROCEDURE ***/!!!
--** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "PURCHASING.VENDOR" **
CREATE OR REPLACE PROCEDURE PURCHASING.FOO ()
RETURNS VARCHAR
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
I INT := 0;
P INT;
BEGIN
Select
COUNT(*)
INTO
:P
FROM
PURCHASING.VENDOR;
WHILE (:P < 1000) LOOP
I := :I + 1;
P := :P + :I;
END LOOP;
IF ((:I = 6)) THEN
RETURN 1;
END IF;
RETURN :P;
END;
$$;
SELECT
PURCHASING.FOO() !!!RESOLVE EWI!!! /*** SSC-EWI-0067 - UDF WAS TRANSFORMED TO SNOWFLAKE PROCEDURE, CALLING PROCEDURES INSIDE QUERIES IS NOT SUPPORTED ***/!!! AS RESULT;
Oracle:¶
Código de entrada¶
CREATE FUNCTION employee_function (param1 in NUMBER) RETURN NUMBER is
var1 employees.employee_ID%TYPE;
var2 employees.manager_ID%TYPE;
var3 employees.title%TYPE;
BEGIN
SELECT employee_ID, manager_ID, title
INTO var1, var2, var3
FROM employees
START WITH manager_ID = param1
CONNECT BY manager_ID = PRIOR employee_id;
RETURN var1;
EXCEPTION
WHEN no_data_found THEN RETURN param1;
END employee_function;
SELECT employee_function(2) FROM employees;
Código gerado¶
!!!RESOLVE EWI!!! /*** SSC-EWI-0068 - USER DEFINED FUNCTION WAS TRANSFORMED TO SNOWFLAKE PROCEDURE ***/!!!
--** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "employees" **
CREATE OR REPLACE PROCEDURE employee_function (param1 NUMBER(38, 18))
RETURNS NUMBER(38, 18)
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "oracle", "convertedOn": "07/10/2025", "domain": "no-domain-provided" }}'
EXECUTE AS CALLER
AS
$$
DECLARE
var1 employees.employee_ID%TYPE;
var2 employees.manager_ID%TYPE;
var3 employees.title%TYPE;
BEGIN
SELECT employee_ID, manager_ID, title
INTO
:var1,
:var2,
:var3
FROM
employees
START WITH manager_ID = :param1
CONNECT BY
manager_ID = PRIOR employee_id;
RETURN :var1;
EXCEPTION
WHEN no_data_found THEN
RETURN :param1;
END;
$$;
--** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "employees" **
SELECT
!!!RESOLVE EWI!!! /*** SSC-EWI-0067 - UDF WAS TRANSFORMED TO SNOWFLAKE PROCEDURE, CALLING PROCEDURES INSIDE QUERIES IS NOT SUPPORTED ***/!!! employee_function(2) FROM
employees;
Práticas recomendadas¶
O código-fonte pode precisar ser reestruturado para se encaixar nas funções definidas pelo usuário abordagem.
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-EWI-0068¶
A função definida pelo usuário foi transformada em um procedimento do Snowflake.
As funções definidas pelo usuário do Snowflake são incompatíveis com os mesmos recursos do Oracle ou SQL Server. Para manter a equivalência funcional, a função é transformada em um procedimento armazenado do Snowflake. Isso afetará seu uso em consultas.
Exemplo de código¶
SQL Server:¶
Código de entrada¶
CREATE OR ALTER FUNCTION PURCHASING.FOO()
RETURNS INT
AS
BEGIN
DECLARE @i int = 0, @p int;
Select @p = COUNT(*) FROM PURCHASING.VENDOR
WHILE (@p < 1000)
BEGIN
SET @i = @i + 1
SET @p = @p + @i
END
IF (@i = 6)
RETURN 1
RETURN @p
END;
Código gerado¶
!!!RESOLVE EWI!!! /*** SSC-EWI-0068 - USER DEFINED FUNCTION WAS TRANSFORMED TO SNOWFLAKE PROCEDURE ***/!!!
CREATE OR REPLACE PROCEDURE PURCHASING.FOO ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "transact", "convertedOn": "06/25/2025", "domain": "no-domain-provided" }}'
EXECUTE AS CALLER
AS
$$
DECLARE
I INT := 0;
P INT;
BEGIN
Select
COUNT(*)
INTO
:P
FROM
PURCHASING.VENDOR;
WHILE (:P < 1000) LOOP
I := :I + 1;
P := :P + :I;
END LOOP;
IF ((:I = 6)) THEN
RETURN 1;
END IF;
RETURN :P;
END;
$$;
Oracle:¶
Código de entrada¶
CREATE OR REPLACE FUNCTION FUN1(PAR1 VARCHAR)
RETURN VARCHAR
IS
VAR1 VARCHAR(20);
VAR2 VARCHAR(20);
BEGIN
SELECT COL1 INTO VAR1 FROM TABLE1 where col1 = 1;
VAR2 := PAR1 || VAR1;
RETURN VAR2;
END;
/
Código gerado¶
!!!RESOLVE EWI!!! /*** SSC-EWI-0068 - USER DEFINED FUNCTION WAS TRANSFORMED TO SNOWFLAKE PROCEDURE ***/!!!
CREATE OR REPLACE PROCEDURE FUN1(PAR1 VARCHAR)
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
DECLARE
VAR1 VARCHAR(20);
VAR2 VARCHAR(20);
BEGIN
SELECT COL1 INTO
:VAR1
FROM
TABLE1
where col1 = 1;
VAR2 := NVL(:PAR1 :: STRING, '') || NVL(:VAR1 :: STRING, '');
RETURN :VAR2;
END;
$$;
Práticas recomendadas¶
Separe as consultas internas para manter a mesma lógica.
O código-fonte pode precisar ser reestruturado para se encaixar nas funções definidas pelo usuário abordagem.
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-EWI-0073¶
Revisão de equivalência funcional pendente
Gravidade¶
Medium
Descrição¶
Este EWI é adicionado quando há uma cláusula gramatical na plataforma de entrada que ainda não foi revisada pela equipe de desenvolvimento do SnowConvert AI, a fim de fornecer compatibilidade com ele no Snowflake. Isso significa que o código não foi transformado de forma alguma e, portanto, é algo que pode não funcionar no Snowflake sem alguma revisão manual.
Exemplo de código¶
SQLServer:¶
Código de entrada¶
CREATE OR ALTER PROC SampleProcedure
AS
BEGIN
INSERT INTO aTable (columnA = 'varcharValue', columnB = 1);
INSERT exampleTable VALUES ('Hello', 23);
INSERT INTO exampleTable DEFAULT VALUES;
END
Código gerado¶
CREATE OR REPLACE PROCEDURE SampleProcedure ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"transact"}}'
EXECUTE AS CALLER
AS
$$
BEGIN
INSERT INTO aTable (columnA = 'varcharValue', columnB = 1);
INSERT INTO exampleTable VALUES ('Hello', 23);
!!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'INSERT WITH DEFAULT VALUES' NODE ***/!!!
INSERT INTO exampleTable DEFAULT VALUES;
END;
$$;
Observe, na linha 6 do código de entrada, que há uma referência a uma instrução INSERT com DEFAULT VALUES. Esta é uma instrução atualmente incompatível com o SnowConvert AI e é por isso que o EWI é gerado nas linhas 11 e 12.
Práticas recomendadas¶
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-EWI-0077¶
Ciclo encontrado entre chamadas de CTE. Os CTEs não pode ser ordenados.
Gravidade¶
Low
Descrição¶
Este aviso é adicionado quando uma consulta que tem várias chamadas de referência CTE (expressão de tabela comum) cria um ciclo que não pode determinar a ordem de chamada das CTEs e, assim, as CTEs não podem ser ordenadas e a consulta permanecerá como a origem.
Exemplo de código¶
Código de entrada (Teradata):¶
WITH t1(c1) as (SELECT c1 FROM t2),
t2(c2) as (SELECT c2 FROM t3),
RECURSIVE t3(c3) as (SELECT c3, someOtherColumn FROM t1, t3)
SELECT * FROM t1;
Código gerado:¶
!!!RESOLVE EWI!!! /*** SSC-EWI-0077 - CYCLE FOUND BETWEEN CTE REFERENCE CALLS, CTES CANNOT BE ORDERED AND THE QUERY WILL REMAIN AS ORIGINAL ***/!!!
WITH RECURSIVE t1(c1) AS
(
SELECT
c1 FROM t2
),
t2(c2) AS
(
SELECT
c2 FROM t3
),
t3(c3) AS
(
SELECT
c3,
someOtherColumn FROM t1, t3
)
SELECT
* FROM t1;
Práticas recomendadas¶
Não são necessárias ações adicionais do usuário.
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-EWI-0080¶
O valor padrão não é permitido em colunas binárias
Severidade ¶
Low
Descrição ¶
Este EWI é adicionado quando o código-fonte tem um valor padrão para o tipo de dados BINARY, que não é compatível com SnowFlake SQL
Código de exemplo ¶
Código de entrada (SqlServer):
create table test1345
(
key1 binary default 0
);
Código de saída:
CREATE OR REPLACE TABLE test1345
(
key1 BINARY
!!!RESOLVE EWI!!! /*** SSC-EWI-0080 - DEFAULT VALUE IS NOT ALLOWED ON BINARY COLUMNS ***/!!!
default 0
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"transact"}}'
;
Práticas recomendadas ¶
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-EWI-0084¶
XMLTABLE não é suportado.
Gravidade¶
High
Descrição¶
A função XMLTABLE é atualmente incompatível.
Exemplo de código¶
Código de entrada (DB2):¶
SELECT
*
FROM
XMLTABLE(
'stringValue' PASSING BY REF passingExpr AS AliasName
) AS XMLTABLENAME
Código gerado:¶
SELECT
*
FROM
!!!RESOLVE EWI!!! /*** SSC-EWI-0084 - XMLTABLE IS NOT SUPPORTED BY SNOWFLAKE ***/!!!
XMLTABLE(
'stringValue' PASSING BY REF passingExpr AS AliasName
) AS XMLTABLENAME
Práticas recomendadas¶
Verifique este blog para saber sobre transformações XML no Snowflake.
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-EWI-0086¶
Substituição de caracteres inválidos para o novo identificador
Nota
Este EWI está obsoleto, consulte a documentação SSC-FDM-0030.
Gravidade¶
Low
Descrição¶
O identificador fornecido possui caracteres inválidos para a linguagem de saída. Esses caracteres foram substituídos por seus códigos UTF-8.
Exemplo de código¶
Código de entrada (Oracle):¶
CREATE PROCEDURE PROC1
AS
"VAR0" INT;
"VAR`/1ͷ" VARCHAR(20);
"o*/o" FLOAT;
" . " INT;
". ." INT;
"123Name" INT;
"return" INT;
yield INT;
ident#10 INT;
BEGIN
NULL;
END;
Código gerado:¶
CREATE OR REPLACE PROCEDURE PROC1 ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
DECLARE
"VAR0" INT;
!!!RESOLVE EWI!!! /*** SSC-EWI-0086 - IDENTIFIER '"VAR`/1ͷ"' HAS INVALID CHARACTERS. CHARACTERS WERE REPLACED WITH THEIR UTF-8 CODES ***/!!!
VAR_u60_u2F1ͷ VARCHAR(20);
!!!RESOLVE EWI!!! /*** SSC-EWI-0086 - IDENTIFIER '"o*/o"' HAS INVALID CHARACTERS. CHARACTERS WERE REPLACED WITH THEIR UTF-8 CODES ***/!!!
o_u2A_u2Fo FLOAT;
!!!RESOLVE EWI!!! /*** SSC-EWI-0086 - IDENTIFIER '" . "' HAS INVALID CHARACTERS. CHARACTERS WERE REPLACED WITH THEIR UTF-8 CODES ***/!!!
_u20_u2E_u20 INT;
!!!RESOLVE EWI!!! /*** SSC-EWI-0086 - IDENTIFIER '". ."' HAS INVALID CHARACTERS. CHARACTERS WERE REPLACED WITH THEIR UTF-8 CODES ***/!!!
_u2E_u20_u2E INT;
"123Name" INT;
"return" INT;
yield INT;
IDENT_HASHTAG_10 INT;
BEGIN
NULL;
END;
$$;
Práticas recomendadas¶
Nenhuma ação do usuário final é necessária.
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-EWI-0092¶
A exibição materializada foi convertida em exibição comum.
Perigo
Obsoleto
Gravidade¶
Low
Descrição¶
As exibições materializadas do Snowflake têm certas limitações mencionadas aqui. No momento, todas as exibições materializadas estão sendo convertidas em exibições comuns sem as cláusulas adicionais que tinham. No futuro, o SnowConvert AI vai converter os casos compatíveis em exibições materializadas do Snowflake.
Exemplo de código¶
Código de entrada: ¶
CREATE MATERIALIZED VIEW MATERIALIZED_VIEW1
SEGMENT CREATION IMMEDIATE
ORGANIZATION HEAP PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
INMEMORY PRIORITY NONE MEMCOMPRESS FOR QUERY LOW DISTRIBUTE AUTO NO DUPLICATE
AS
select
*
from
aTable;
Código gerado:¶
!!!RESOLVE EWI!!! /*** SSC-EWI-0092 - MATERIALIZED VIEW WAS CONVERTED TO REGULAR VIEW. ***/!!!
CREATE OR REPLACE VIEW MATERIALIZED_VIEW1
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"oracle"}}'
AS
--** SSC-FDM-0001 - VIEWS SELECTING ALL COLUMNS FROM A SINGLE TABLE ARE NOT REQUIRED IN SNOWFLAKE AND MAY IMPACT PERFORMANCE. **
select
*
from
aTable;
Práticas recomendadas¶
Não são necessárias ações adicionais do usuário.
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-EWI-0094¶
Declaração de rótulo sem suporte
Gravidade¶
Low
Descrição¶
Atualmente, não há equivalente para declaração de rótulos no Snow Scripting, portanto, um EWI é adicionado, e o rótulo é colocado como comentário
Exemplo de código¶
Código de entrada (Oracle):¶
CREATE OR REPLACE PROCEDURE Example ( grade NUMBER )
IS
BEGIN
<<CASE1>><<CASE2>>
CASE grade
WHEN 10 THEN NULL;
ELSE NULL;
END CASE CASE1;
END;
Código gerado:¶
CREATE OR REPLACE PROCEDURE Example (grade NUMBER(38, 18))
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"oracle"}}'
EXECUTE AS CALLER
AS
$$
BEGIN
!!!RESOLVE EWI!!! /*** SSC-EWI-0094 - LABEL DECLARATION FOR A STATEMENT IS NOT SUPPORTED BY SNOWFLAKE SCRIPTING <<CASE1>><<CASE2>> ***/!!!
CASE :grade
WHEN 10 THEN
NULL;
ELSE NULL;
END CASE;
END;
$$;
Práticas recomendadas¶
Nenhuma ação do usuário final é necessária.
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-EWI-0101¶
Nome do rótulo da transação colocado como comentário por não ser aplicável no Snowflake
Gravidade¶
Low
Descrição¶
O Snowflake não opera nomes de rótulos de transação porque não deve haver transações aninhadas a identificar em instruções COMMIT ou ROLLBACK diferentes.
Exemplo de código¶
Código de entrada (SQL Server):¶
CREATE PROCEDURE TestTransaction
AS
BEGIN
DROP TABLE IF EXISTS NEWTABLE;
CREATE TABLE NEWTABLE(COL1 INT, COL2 VARCHAR);
BEGIN TRANSACTION LabelA;
INSERT INTO NEWTABLE VALUES (1, 'MICHAEL');
INSERT INTO NEWTABLE VALUES(2, 'JACKSON');
COMMIT TRANSACTION LabelA;
END
Código gerado:¶
CREATE OR REPLACE PROCEDURE TestTransaction ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"transact"}}'
EXECUTE AS CALLER
AS
$$
BEGIN
DROP TABLE IF EXISTS NEWTABLE;
CREATE OR REPLACE TABLE NEWTABLE (
COL1 INT,
COL2 VARCHAR
);
BEGIN TRANSACTION
!!!RESOLVE EWI!!! /*** SSC-EWI-0101 - COMMENTED OUT TRANSACTION LABEL NAME BECAUSE IS NOT APPLICABLE IN SNOWFLAKE ***/!!!
LabelA;
INSERT INTO NEWTABLE VALUES (1, 'MICHAEL');
INSERT INTO NEWTABLE VALUES(2, 'JACKSON');
COMMIT;
END;
$$;
Práticas recomendadas¶
Nenhuma ação do usuário final é necessária.
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-EWI-0102¶
Opção de instrução removida do código; já tratada na conversão para Snowflake
Nota
Este EWI está obsoleto.
Gravidade¶
Low
Descrição¶
As instruções do Snowflake podem remover algumas opções quando tratadas pela regra de conversão. Portanto, ele será removido do código de saída, mas a funcionalidade é equivalente.
Exemplo de código¶
Código de entrada (PostgreSQL):¶
-- Case 1:
TRUNCATE ONLY table_base2 RESTART IDENTITY CASCADE;
-- Case 2:
TRUNCATE TABLE table_inherit_and_generated RESTART IDENTITY CASCADE;
Código gerado:¶
-- Case 1:
!!!RESOLVE EWI!!! /*** SSC-EWI-0102 - REMOVED ONLY OPTION FROM CODE, ALREADY HANDLED IN CONVERSION TO SNOWFLAKE ***/!!!!!!RESOLVE EWI!!! /*** SSC-EWI-0102 - REMOVED CASCADE OPTION FROM CODE, ALREADY HANDLED IN CONVERSION TO SNOWFLAKE ***/!!!!!!RESOLVE EWI!!! /*** SSC-EWI-0102 - REMOVED RESTART IDENTITY OPTION FROM CODE, ALREADY HANDLED IN CONVERSION TO SNOWFLAKE ***/!!!
TRUNCATE table_base2;
-- Case 2:
!!!RESOLVE EWI!!! /*** SSC-EWI-0102 - REMOVED CASCADE OPTION FROM CODE, ALREADY HANDLED IN CONVERSION TO SNOWFLAKE ***/!!!!!!RESOLVE EWI!!! /*** SSC-EWI-0102 - REMOVED RESTART IDENTITY OPTION FROM CODE, ALREADY HANDLED IN CONVERSION TO SNOWFLAKE ***/!!!
TRUNCATE TABLE table_inherit_and_generated;
Práticas recomendadas¶
Nenhuma ação do usuário final é necessária.
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-EWI-0107¶
Literal de intervalo incompatível com o cenário atual
Gravidade¶
High
Descrição¶
Os intervalos do Snowflake só podem ser usados em operações aritméticas. Intervalos utilizados em qualquer outro cenário são incompatíveis.
Código de exemplo ¶
Código de entrada:
SELECT INTERVAL '1-5' YEAR TO MONTH FROM DUAL;
Código de saída:
SELECT
!!!RESOLVE EWI!!! /*** SSC-EWI-0107 - INTERVAL LITERAL IS NOT SUPPORTED BY SNOWFLAKE IN THIS SCENARIO ***/!!!
INTERVAL '1-5' YEAR TO MONTH FROM DUAL;
Práticas recomendadas ¶
Nenhuma ação do usuário final é necessária.
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-EWI-0108¶
A subconsulta a seguir corresponde a pelo menos um dos padrões considerados inválidos e pode produzir erros de compilação
Gravidade¶
High
Descrição¶
No Snowflake, há vários padrões e elementos em uma subconsulta que são incompatíveis e a tornam não executável. De acordo com a documentação do Snowflake sobre subconsultas, os seguintes tipos de subconsultas são compatíveis:
Subconsultas escalares não correlacionadas em qualquer lugar em que uma expressão de valor possa ser usada.
Subconsultas escalares correlacionadas em cláusulas WHERE.
Subconsultas EXISTS, ANY/ALL e IN em cláusulas WHERE. Estas subconsultas podem ser correlacionadas ou não correlacionadas.
Observe que a lista acima não é conclusiva, o que significa que as subconsultas que não correspondem a nenhum dos tipos especificados ainda podem ser consideradas válidas.
Para ajudar a evitar erros, o SnowConvert AI conhece um conjunto de padrões de subconsultas que normalmente invalidam subconsultas. Esse EWI é adicionado para alertar o usuário de que a subconsulta corresponde a pelo menos um desses padrões e, portanto, pode produzir erros quando compilada no Snowflake.
Exemplo de código¶
Código de entrada: ¶
CREATE TABLE tableA
(
col1 INTEGER,
col2 VARCHAR(20)
);
CREATE TABLE tableB
(
col3 INTEGER,
col4 VARCHAR(20)
);
INSERT INTO tableA VALUES (50, 'Hey');
INSERT INTO tableB VALUES (50, 'Hey');
INSERT INTO tableB VALUES (50, 'Example');
INSERT INTO tableB VALUES (10, 'Bye');
-- Snowflake only allows the usage of FETCH in subqueries that are uncorrelated scalar, this subquery execution will fail
SELECT col2
FROM tableA
WHERE col2 = (SELECT col4 FROM tableB WHERE col3 = col1 FETCH FIRST ROW ONLY);
-- This subquery is uncorrelated scalar so FETCH is valid to use
SELECT col2
FROM tableA
WHERE col2 = (SELECT col4 FROM tableB FETCH FIRST ROW ONLY);
Código gerado:¶
CREATE OR REPLACE TABLE tableA
(
col1 INTEGER,
col2 VARCHAR(20)
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "oracle", "convertedOn": "12/05/2024", "domain": "test" }}'
;
CREATE OR REPLACE TABLE tableB
(
col3 INTEGER,
col4 VARCHAR(20)
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "oracle", "convertedOn": "12/05/2024", "domain": "test" }}'
;
INSERT INTO tableA
VALUES (50, 'Hey');
INSERT INTO tableB
VALUES (50, 'Hey');
INSERT INTO tableB
VALUES (50, 'Example');
INSERT INTO tableB
VALUES (10, 'Bye');
-- Snowflake only allows the usage of FETCH in subqueries that are uncorrelated scalar, this subquery execution will fail
SELECT col2
FROM
tableA
WHERE col2 =
--** SSC-FDM-0002 - CORRELATED SUBQUERIES MAY HAVE SOME FUNCTIONAL DIFFERENCES. **
!!!RESOLVE EWI!!! /*** SSC-EWI-0108 - THE FOLLOWING SUBQUERY MATCHES AT LEAST ONE OF THE PATTERNS CONSIDERED INVALID AND MAY PRODUCE COMPILATION ERRORS ***/!!! (SELECT
ANY_VALUE( col4) FROM
tableB
WHERE col3 = col1
FETCH FIRST 1 ROW ONLY);
-- This subquery is uncorrelated scalar so FETCH is valid to use
SELECT col2
FROM
tableA
WHERE col2 = (SELECT col4 FROM
tableB
FETCH FIRST 1 ROW ONLY);
Práticas recomendadas¶
Verifique a subconsulta no Snowflake; se ela compilar sem problemas, então este EWI poderá ser ignorado com segurança.
Verifique a seção de padrões complexos para subconsultas dentro do relatório de avaliação, ele contém uma lista dos padrões que normalmente invalidam as subconsultas e suas ocorrências. Ela pode ser usada para revisar as subconsultas migradas e por que são consideradas inválidas.
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-EWI-0109¶
A sintaxe de Alter table não é aplicável no Snowflake.
Gravidade¶
Medium
Descrição¶
A sintaxe de Alter Table usada não é aplicável no Snowflake, portanto, esta mensagem está sendo adicionada.
Exemplo de código:¶
Código de entrada:¶
ALTER TABLE SOMENAME DEFAULT COLLATION SOMENAME;
ALTER TABLE SOMENAME ROW ARCHIVAL;
ALTER TABLE SOMENAME MODIFY CLUSTERING;
ALTER TABLE SOMENAME DROP CLUSTERING;
ALTER TABLE SOMENAME SHRINK SPACE COMPACT CASCADE;
Código gerado:¶
!!!RESOLVE EWI!!! /*** SSC-EWI-0109 - ALTER TABLE SYNTAX NOT APPLICABLE IN SNOWFLAKE ***/!!!
ALTER TABLE SOMENAME
DEFAULT COLLATION SOMENAME;
!!!RESOLVE EWI!!! /*** SSC-EWI-0109 - ALTER TABLE SYNTAX NOT APPLICABLE IN SNOWFLAKE ***/!!!
ALTER TABLE SOMENAME
ROW ARCHIVAL;
!!!RESOLVE EWI!!! /*** SSC-EWI-0109 - ALTER TABLE SYNTAX NOT APPLICABLE IN SNOWFLAKE ***/!!!
ALTER TABLE SOMENAME
MODIFY CLUSTERING;
!!!RESOLVE EWI!!! /*** SSC-EWI-0109 - ALTER TABLE SYNTAX NOT APPLICABLE IN SNOWFLAKE ***/!!!
ALTER TABLE SOMENAME
DROP CLUSTERING;
!!!RESOLVE EWI!!! /*** SSC-EWI-0109 - ALTER TABLE SYNTAX NOT APPLICABLE IN SNOWFLAKE ***/!!!
ALTER TABLE SOMENAME
SHRINK SPACE COMPACT CASCADE;
Práticas recomendadas¶
Não são necessárias ações adicionais do usuário.
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-EWI-0110¶
Transformação não realizada devido a dependências ausentes
Gravidade¶
Low
Descrição¶
Quando há dependências ausentes, o EWI é adicionado para indicar que uma transformação não pode ser executada. O SnowConvert AI utiliza árvores de sintaxe abstratos para criar um modelo semântico do código de entrada, que é então usado para gerar um novo código que replica a funcionalidade da fonte original. Entretanto, neste cenário específico, a transformação não pôde ser concluída porque o modelo semântico carece de certas dependências.
Exemplo de código¶
Código de entrada:¶
ALTER TABLE MissingTable ADD
CONSTRAINT constraint1 DEFAULT (suser_name()) FOR col1;
Código gerado:¶
--** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "MissingTable" **
!!!RESOLVE EWI!!! /*** SSC-EWI-0110 - TRANSFORMATION NOT PERFORMED DUE TO MISSING DEPENDENCIES ***/!!!
ALTER TABLE MissingTable
ADD
CONSTRAINT constraint1 DEFAULT (CURRENT_USER()) FOR col1;
Práticas recomendadas¶
Adicione as dependências ausentes ao código de entrada.
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-EWI-0111¶
Apenas um nível de aninhamento é permitido para procedimentos aninhados no Snowflake.
Gravidade¶
Crítico
Descrição¶
O Snowflake só é compatível com um nível de aninhamento para procedimentos. Não é permitido definir um procedimento aninhado dentro de outro procedimento aninhado. Se este padrão for detectado, este erro será gerado.
Exemplo de código¶
Código de entrada:¶
CREATE OR REPLACE PROCEDURE calculate_executive_salary (
p_result OUT NUMBER
)
AS
PROCEDURE calculate_senior_level (
senior_result OUT NUMBER
)
AS
PROCEDURE calculate_base_level (
base_result OUT NUMBER
)
AS
BEGIN
base_result := 75000;
END calculate_base_level;
BEGIN
calculate_base_level(senior_result);
senior_result := senior_result * 1.5;
END calculate_senior_level;
BEGIN
calculate_senior_level(p_result);
END calculate_executive_salary;
Código gerado:¶
CREATE OR REPLACE PROCEDURE calculate_executive_salary (p_result OUT NUMBER(38, 18)
)
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "oracle", "convertedOn": "07/22/2025", "domain": "no-domain-provided" }}'
EXECUTE AS CALLER
AS
$$
DECLARE
calculate_senior_level PROCEDURE (senior_result NUMBER(38, 18)
)
RETURNS NUMBER
AS
DECLARE
!!!RESOLVE EWI!!! /*** SSC-EWI-0111 - ONLY ONE LEVEL OF NESTING IS ALLOWED FOR NESTED PROCEDURES IN SNOWFLAKE. ***/!!!
PROCEDURE calculate_base_level (
base_result OUT NUMBER
)
AS
BEGIN
base_result := 75000;
END calculate_base_level;
call_results NUMBER;
BEGIN
call_results := (
CALL
calculate_base_level(:senior_result)
);
senior_result := :call_results;
senior_result := :senior_result * 1.5;
RETURN senior_result;
END;
call_results NUMBER;
BEGIN
call_results := (
CALL
calculate_senior_level(:p_result)
);
p_result := :call_results;
END;
$$;
Práticas recomendadas¶
Refatore seu código para evitar mais de um nível de procedimentos aninhados. Mova procedimentos profundamente aninhados para o nível superior ou reestruture sua lógica para cumprir a limitação de aninhamento de nível único do Snowflake.
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-EWI-0112¶
A sobrecarga de procedimentos aninhados é incompatível.
Gravidade¶
Crítico
Descrição¶
O Snowflake não é compatível com a sobrecarga de procedimentos aninhados. Em outras palavras, você não pode definir vários procedimentos aninhados com o mesmo nome, mas listas de parâmetros diferentes dentro do mesmo procedimento pai. Se o código-fonte contiver procedimentos aninhados sobrecarregados, este erro será gerado para indicar que tais padrões são incompatíveis com o Snowflake.
Exemplo de código¶
Código de entrada:¶
CREATE OR REPLACE PROCEDURE demonstrate_salary_calculations(
final_summary OUT VARCHAR2
)
AS
result1 VARCHAR2(100);
result2 VARCHAR2(100);
result3 VARCHAR2(100);
PROCEDURE calculate_salary(
output OUT VARCHAR2
)
AS
BEGIN
output := 'Standard: 55000';
END;
PROCEDURE calculate_salary(
base_amount IN NUMBER,
output OUT VARCHAR2
)
AS
BEGIN
output := 'Calculated: ' || (base_amount * 1.15);
END;
PROCEDURE calculate_salary(
employee_level IN VARCHAR2,
output OUT VARCHAR2
)
AS
BEGIN
output := 'Level ' || UPPER(employee_level) || ': 60000';
END;
BEGIN
calculate_salary(result1);
calculate_salary(50000, result2);
calculate_salary('senior', result3);
final_summary := result1 || ' | ' || result2 || ' | ' || result3;
END demonstrate_salary_calculations;
Código gerado:¶
CREATE OR REPLACE PROCEDURE demonstrate_salary_calculations (final_summary OUT VARCHAR
)
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "oracle", "convertedOn": "07/22/2025", "domain": "no-domain-provided" }}'
EXECUTE AS CALLER
AS
$$
DECLARE
result1 VARCHAR(100);
result2 VARCHAR(100);
result3 VARCHAR(100);
calculate_salary PROCEDURE(output VARCHAR
)
RETURNS VARCHAR
AS
BEGIN
output := 'Standard: 55000';
RETURN output;
END;
!!!RESOLVE EWI!!! /*** SSC-EWI-0112 - NESTED PROCEDURE OVERLOADING IS NOT SUPPORTED. ***/!!!
calculate_salary PROCEDURE(base_amount NUMBER(38, 18), output VARCHAR
)
RETURNS VARCHAR
AS
BEGIN
output := 'Calculated: ' || NVL((:base_amount * 1.15) :: STRING, '');
RETURN output;
END;
!!!RESOLVE EWI!!! /*** SSC-EWI-0112 - NESTED PROCEDURE OVERLOADING IS NOT SUPPORTED. ***/!!!
calculate_salary PROCEDURE(employee_level VARCHAR, output VARCHAR
)
RETURNS VARCHAR
AS
BEGIN
output := 'Level ' || NVL(UPPER(:employee_level) :: STRING, '') || ': 60000';
RETURN output;
END;
call_results VARCHAR;
BEGIN
call_results := (
CALL
calculate_salary(:result1)
);
result1 := :call_results;
call_results := (
CALL
calculate_salary(50000, :result2)
);
result2 := :call_results;
call_results := (
CALL
calculate_salary('senior', :result3)
);
result3 := :call_results;
final_summary := NVL(:result1 :: STRING, '') || ' | ' || NVL(:result2 :: STRING, '') || ' | ' || NVL(:result3 :: STRING, '');
END;
$$;
Práticas recomendadas¶
A tentativa de sobrecarregar os procedimentos aninhados no Snowflake resultará em erros de compilação ou comportamento inesperado. Para garantir a compatibilidade, você deve refatorar seu código para evitar sobrecarregar os procedimentos aninhados. Considere renomear procedimentos para que cada procedimento aninhado tenha um nome exclusivo em seu escopo ou reestruture sua lógica para eliminar a necessidade de sobrecarga. Além disso, revise e atualize todas as chamadas de procedimento para usar os novos nomes exclusivos.
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-EWI-0113¶
O uso de UDF do Script Snowflake é incompatível neste cenário.
Gravidade¶
Medium
Descrição¶
O uso de UDFs do Script Snowflake em cenários específicos é incompatível. Os seguintes casos são compatíveis:
UDFs do Script Snowflake não podem ser usadas ao criar uma exibição materializada.
Não é possível usar UDFs do Script Snowflake para especificar um valor de coluna padrão.
Exemplo de código¶
Código de entrada:¶
CREATE TABLE Table1 (
col1 INT DEFAULT SnowScriptUdf()
);
CREATE MATERIALIZED VIEW CreateView1
AS
SELECT
col1,
SnowScriptUdf() AS col2
FROM Table1;
Código gerado:¶
CREATE OR REPLACE TABLE Table1 (
col1 INT DEFAULT SnowScriptUdf() !!!RESOLVE EWI!!! /*** SSC-EWI-0113 - THE USAGE OF SNOWFLAKE SCRIPTING UDF IS NOT SUPPORTED IN THIS SCENARIO. ***/!!!
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "transact", "convertedOn": "09/17/2025", "domain": "no-domain-provided" }}'
;
CREATE OR REPLACE DYNAMIC TABLE CreateView1
--** SSC-FDM-0031 - DYNAMIC TABLE REQUIRED PARAMETERS SET BY DEFAULT **
TARGET_LAG='1 day'
WAREHOUSE=UPDATE_DUMMY_WAREHOUSE
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "transact", "convertedOn": "09/17/2025", "domain": "no-domain-provided" }}'
AS
SELECT
col1,
SnowScriptUdf() !!!RESOLVE EWI!!! /*** SSC-EWI-0113 - THE USAGE OF SNOWFLAKE SCRIPTING UDF IS NOT SUPPORTED IN THIS SCENARIO. ***/!!! AS col2
FROM
Table1;
Práticas recomendadas¶
Se precisar de mais suporte, envie um e-mail para snowconvert-support@snowflake.com
SSC-EWI-0114¶
MIXED CONTINUE AND EXIT EXCEPTION HANDLERS IN THE SAME BLOCK ARE NOT SUPPORTED BY SNOWFLAKE SCRIPTING.
Gravidade¶
Medium
Nota
Algumas partes do código de saída foram omitidas por motivos de clareza.
Descrição¶
In database systems like DB2, Teradata, and others, it is possible to declare both CONTINUE and EXIT exception handlers in the same procedural block. However, Snowflake Scripting does not support mixing CONTINUE and EXIT handlers within the same EXCEPTION block.
When SnowConvert AI encounters a procedure with both types of handlers declared in the same block, it generates separate EXCEPTION blocks for each handler type and adds this EWI to indicate that manual review and testing are required to ensure the converted code maintains the intended behavior.
Key Behavioral Differences:
CONTINUE HANDLER: Allows execution to continue after handling the exception
EXIT HANDLER: Terminates the current block after handling the exception
Since Snowflake cannot mix these behaviors in a single EXCEPTION block, the conversion may result in different execution flow compared to the source system.
Exemplo de código¶
Código de entrada:¶
DB2
CREATE OR REPLACE PROCEDURE with_continueAndExit()
BEGIN
DECLARE test_1 INTEGER DEFAULT 10;
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
INSERT INTO error_test VALUES ('EXCEPTION');
DECLARE EXIT HANDLER FOR SQLSTATE '20000'
INSERT INTO error_test VALUES ('ERROR 2000');
SET test_1 = 1 / 0;
INSERT INTO error_test VALUES ('EXIT');
END;
Código gerado:¶
Snowflake
CREATE OR REPLACE PROCEDURE with_continueAndExit()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "db2", "convertedOn": "01/15/2025" }}'
AS
$$
DECLARE
test_1 INTEGER DEFAULT 10;
BEGIN
test_1 := 1 / 0;
INSERT INTO error_test VALUES ('EXIT');
EXCEPTION
WHEN OTHER CONTINUE THEN
INSERT INTO error_test VALUES ('EXCEPTION')
!!!RESOLVE EWI!!! /*** SSC-EWI-0114 - MIXED CONTINUE AND EXIT EXCEPTION HANDLERS IN THE SAME BLOCK ARE NOT SUPPORTED BY SNOWFLAKE SCRIPTING ***/!!!
EXCEPTION
WHEN OTHER EXIT THEN
CASE
WHEN (SQLSTATE = '20000') THEN
INSERT INTO error_test VALUES ('ERROR 2000')
END
END;
$$;
Práticas recomendadas¶
When dealing with mixed CONTINUE and EXIT handlers:
Review Exception Handling Logic: Carefully review the converted code to understand how exceptions are handled in each block.
Test Thoroughly: Test all error scenarios to ensure the behavior matches the source system’s expectations.
Consider Refactoring: If possible, refactor the code to use only one type of handler (either all CONTINUE or all EXIT) within a block.
Use Nested Blocks: Consider restructuring the logic using nested BEGIN…END blocks, where each block has its own exception handling strategy.
Document Behavior Changes: Document any differences in exception handling behavior for future maintenance.
Recommended Pattern¶
Instead of mixing handlers, consider this approach:
BEGIN
-- Handle operations that should continue on error
BEGIN
operation1();
operation2();
EXCEPTION
WHEN OTHER CONTINUE THEN
log_error('Continue handler');
END;
-- Handle operations that should exit on error
BEGIN
critical_operation();
EXCEPTION
WHEN OTHER EXIT THEN
log_error('Exit handler');
END;
END;