SnowConvert AI - Problèmes SQL Server-Azure Synapse

Applies to
  • SQL Server

  • Azure Synapse Analytics

  • Sybase

SSC-EWI-TS0001

Corps de la fonction définie par l’utilisateur non généré

Gravité

Critique

Note

Certaines parties du code de sortie sont omises pour des raisons de clarté.

Description

Cet EWI apparaît lorsque SnowConvert AI gère une exception critique qui empêche le corps de la fonction d’être généré pendant sa traduction.

Exemple de code

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

$$;

Meilleures pratiques

SSC-EWI-TS0002

L’ANSI_PADDING OFF n’est pas pris en charge dans Snowflake.

Gravité

Faible

Note

Certaines parties du code de sortie sont omises pour des raisons de clarté.

Description

In SQL Server, SET ANSI_PADDING controls how trailing blanks are stored in CHAR, VARCHAR, BINARY, and VARBINARY columns. When SET ANSI_PADDING OFF is active during a CREATE TABLE or ALTER TABLE statement, SQL Server records this setting as a column-level property on each column defined in that scope. This means the trimming behavior is permanently associated with the column definition, regardless of the session setting at the time data is inserted.

Specifically, when a column is created with ANSI_PADDING OFF:

  • VARCHAR columns have trailing blanks trimmed on insert.

  • VARBINARY columns have trailing zeros trimmed on insert.

  • CHAR columns are trimmed of trailing blanks (instead of being right-padded to the defined length).

Snowflake has no equivalent column-level property. Snowflake always preserves trailing spaces in string values (equivalent to ANSI_PADDING ON). There is no way to configure a Snowflake column to automatically trim trailing blanks on insert.

Since this is a storage-level semantic difference that cannot be automatically translated, SnowConvert AI flags the statement with this EWI.

Exemple de code

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

Limitations

Snowflake does not support ANSI_PADDING OFF semantics at any level (session, database, or column).

  • Wrapping inserts with RTRIM: This only handles explicit INSERT statements in the migrated code. It does not cover data loaded through ETL pipelines, external tools, or application code that also relied on the column’s ANSI_PADDING OFF property.

  • Session-level setting: Snowflake has no session parameter equivalent to SET ANSI_PADDING.

  • Column-level constraint or default: Snowflake does not allow defining a column property that automatically trims trailing spaces.

To fully replicate ANSI_PADDING OFF behavior in Snowflake, manual intervention is required at the data pipeline level for every affected column.

Meilleures pratiques

  • Identify all columns that were created under SET ANSI_PADDING OFF in the source SQL Server database. You can query sys.columns with is_ansi_padded = 0 to find them.

  • For each affected column, ensure that all data insertion paths (SQL scripts, ETL pipelines, application code) apply RTRIM before inserting into the corresponding Snowflake column.

  • Consider creating a Snowflake stored procedure or UDF wrapper that enforces trimming for the affected columns.

  • Review whether the trimming behavior is actually relied upon by downstream consumers. In some cases, ANSI_PADDING OFF was set by default in legacy scripts without the application depending on the trimming behavior.

  • Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.

SSC-EWI-TS0003

L’ANSI_WARNINGS OFF n’est pas pris en charge dans Snowflake.

Gravité

Faible

Note

Certaines parties du code de sortie sont omises pour des raisons de clarté.

Description

Dans Transact-SQL, l’instruction SET ANSI_WARNINGS OFF désactive les avertissements tels que la division par zéro ou le débordement arithmétique. Étant donné que l’instruction SET ANSI_WARNINGS OFF n’est pas un paramètre directement configurable dans Snowflake, SnowConvert AI générera cet EWI.

Exemple de code

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

Meilleures pratiques

SSC-EWI-TS0009

La transaction suivante peut contenir des transactions imbriquées. Cela est considéré comme un modèle complexe qui n’est pas pris en charge dans Snowflake.

Note

Certaines parties du code de sortie sont omises pour des raisons de clarté.

Gravité

Élevé

Description

Cette erreur est ajoutée pour indiquer lorsqu’une transaction peut contenir des transactions imbriquées. Dans SQL Server, les transactions peuvent être imbriquées. Cela signifie qu’il est possible de démarrer une nouvelle transaction à l’intérieur d’une transaction existante. Si après la première instruction BEGIN, une autre instruction est exécutée, une nouvelle transaction sera ouverte, et le nombre de transactions en cours sera augmenté d’un.\

En revanche, cela n’est pas pris en charge dans Snowflake. Par conséquent, la deuxième instruction BEGIN sera ignorée, et il n’y aura toujours qu’une seule transaction. Pour plus d’informations, veuillez vous référer aux transactions SQL Server.

Exemple de code

Code d’entrée :
 CREATE PROC transactionsTest
AS
BEGIN TRANSACTION 
   SELECT @@TRANCOUNT AS TransactionCount_AfterFirstTransaction 
   INSERT INTO TESTSCHEMA.TESTTABLE(ID) VALUES (1), (2) 
   BEGIN TRANSACTION 
      SELECT @@TRANCOUNT AS TransactionCount_AfterSecondTransaction 
      INSERT INTO TESTSCHEMA.TESTTABLE(ID) VALUES (3), (4) 
   COMMIT;
   SELECT @@TRANCOUNT AS TransactionCount_AfterFirstCommit  
COMMIT;
END;
Code généré :
 CREATE OR REPLACE PROCEDURE transactionsTest ()
RETURNS ARRAY
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"transact"}}'
EXECUTE AS CALLER
AS
$$
 DECLARE
  ProcedureResultSet1 VARCHAR;
  ProcedureResultSet2 VARCHAR;
  ProcedureResultSet3 VARCHAR;
  return_arr ARRAY := array_construct();
 BEGIN
  !!!RESOLVE EWI!!! /*** SSC-EWI-TS0009 - THE FOLLOWING TRANSACTION MAY CONTAIN NESTED TRANSACTIONS WHICH ARE NOT SUPPORTED IN SNOWFLAKE. ***/!!!
  BEGIN TRANSACTION;
  ProcedureResultSet1 := 'RESULTSET_' || REPLACE(UPPER(UUID_STRING()), '-', '_');
  CREATE OR REPLACE TEMPORARY TABLE IDENTIFIER(:ProcedureResultSet1) AS
   SELECT
    :TRANCOUNT AS TransactionCount_AfterFirstTransaction;
  return_arr := array_append(return_arr, :ProcedureResultSet1);
  INSERT INTO TESTSCHEMA.TESTTABLE (ID) VALUES (1), (2);
  BEGIN TRANSACTION;
  ProcedureResultSet2 := 'RESULTSET_' || REPLACE(UPPER(UUID_STRING()), '-', '_');
  CREATE OR REPLACE TEMPORARY TABLE IDENTIFIER(:ProcedureResultSet2) AS
   SELECT
    :TRANCOUNT AS TransactionCount_AfterSecondTransaction;
  return_arr := array_append(return_arr, :ProcedureResultSet2);
  INSERT INTO TESTSCHEMA.TESTTABLE (ID) VALUES (3), (4);
  COMMIT;
  ProcedureResultSet3 := 'RESULTSET_' || REPLACE(UPPER(UUID_STRING()), '-', '_');
  CREATE OR REPLACE TEMPORARY TABLE IDENTIFIER(:ProcedureResultSet3) AS
   SELECT
    :TRANCOUNT AS TransactionCount_AfterFirstCommit;
  return_arr := array_append(return_arr, :ProcedureResultSet3);
  COMMIT;
  --** SSC-FDM-0020 - MULTIPLE RESULT SETS ARE RETURNED IN TEMPORARY TABLES **
  RETURN return_arr;
 END;
$$;
-- ** SSC-EWI-0001 - UNRECOGNIZED TOKEN ON LINE '12' COLUMN '1' OF THE SOURCE CODE STARTING AT 'END'. EXPECTED 'BATCH' GRAMMAR. **
--END
   ;

Meilleures pratiques

  • Dans Snowflake, les transactions imbriquées ne provoqueront pas d’erreurs de compilation. Elles seront simplement ignorées. Vous pouvez accéder aux rapports d’évaluation pour vérifier si les transactions imbriquées sont présentes.

  • Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.

SSC-EWI-TS0010

L’expression de table commune dans la vue n’est pas prise en charge dans Snowflake.

Note

Certaines parties du code de sortie sont omises pour des raisons de clarté.

Gravité

Élevé

Description

Cette erreur est ajoutée lorsqu’une CTE non valide se trouve à l’intérieur d’une vue, car les vues sont des représentations matérialisées de requêtes, ce qui signifie qu’elles définissent uniquement la manière dont les données sont extraites et présentées, et non la manière dont elles sont manipulées.

Exemple de code

Code d’entrée :
 Create View viewName
as
with commonTableExpressionName (
   columnName
) as
(
   select
      1
)
((select
   1 as col2)
union
(
   select
      1 as col3
));
Code généré :
 !!!RESOLVE EWI!!! /*** SSC-EWI-TS0010 - COMMON TABLE EXPRESSION IN VIEW NOT SUPPORTED IN SNOWFLAKE. ***/!!!
CREATE OR REPLACE VIEW viewName
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"transact"}}'
AS
!!!RESOLVE EWI!!! /*** SSC-EWI-0021 - WITH CTE NOT SUPPORTED IN SNOWFLAKE ***/!!!
with commonTableExpressionName (
   columnName
) as
(
   select
      1
)
((select
   1 as col2)
union
(
   select
      1 as col3
));

connexesEWI

  1. SSC-EWI-0021 : non pris en charge.

Meilleures pratiques

SSC-EWI-TS0013

Colonne calculée transformée

Note

Cet EWI est obsolète. Veuillez vous référer à la documentation SSC-FDM-TS0013.

Gravité

Faible

Description

Cet avertissement est ajouté lorsqu’une colonne calculée SQL Server est transformée en son équivalent Snowflake. Elle est ajoutée car, dans certains cas, l’équivalence fonctionnelle pourrait être affectée.

Exemple de code

Code d’entrée :
 CREATE TABLE [TestTable](
    [Col1] AS (CONVERT ([REAL], ExpressionValue))
);
Code généré :
 CREATE OR REPLACE TABLE TestTable (
    Col1 REAL AS (CAST(ExpressionValue AS REAL)) /*** SSC-FDM-TS0014 - COMPUTED COLUMN WAS TRANSFORMED TO ITS SNOWFLAKE EQUIVALENT, FUNCTIONAL EQUIVALENCE VERIFICATION PENDING. ***/
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"transact"}}'
;

Meilleures pratiques

  • Aucune action supplémentaire de la part de l’utilisateur n’est requise. Cet avertissement est simplement donné à titre informatif.

  • Ajoutez des modifications manuelles à l’expression non transformée.

  • Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.

SSC-EWI-TS0015

Le type de données n’est pas pris en charge dans Snowflake.

Gravité

Medium

Description

Cet avertissement est ajouté lorsqu’une colonne SQL Server possède un type non pris en charge dans Snowflake.

Exemple de code

Code d’entrée :
 CREATE TABLE table1
(
    column1 customType,
);
Code généré :
 CREATE OR REPLACE TABLE table1
(
    column1 VARIANT !!!RESOLVE EWI!!! /*** SSC-EWI-TS0015 - DATA TYPE CUSTOMTYPE IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"transact"}}'
;

Meilleures pratiques

  • Consultez la [documentation] relative aux types de données de Snowflake(https://docs.snowflake.com/fr/sql-reference/data-types.html) pour trouver un équivalent pour le type de données.

  • Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.

SSC-EWI-TS0016

Traduction de la fonction ODBC Scalar en attente

Note

Certaines parties du code de sortie sont omises pour des raisons de clarté.

Description

Cet EWI est ajouté lorsque SnowConvert AI trouve une fonction ODBC Scalar dans le code d’entrée.\ Les fonctions définies par l’utilisateur ne sont pas prises en charge dans la fonctionODBC Scalar.

Exemple de code

Code d’entrée :
 SELECT {fn CURRENT_DATE_UDF()};
Code généré :
 --** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "CURRENT_DATE_UDF" **
SELECT
CURRENT_DATE_UDF() !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'CURRENT_DATE_UDF' NODE ***/!!!!!!RESOLVE EWI!!! /*** SSC-EWI-TS0016 - USER DEFINED FUNCTIONS ARE NOT SUPPORTED IN ODBC SCALAR FUNCTION. ***/!!!;

connexesEWI

  1. SSC-EWI-0073 : examen de l’équivalence fonctionnelle en attente.

Meilleures pratiques

  • Aucune action supplémentaire de la part de l’utilisateur n’est requise. Cet avertissement est simplement donné à titre informatif.

  • Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.

SSC-EWI-TS0017

Masquage non pris en charge

Gravité

Faible

Description

Cet EWI est ajouté lorsque SnowConvert AI trouve une colonne masquée à l’intérieur d’une instruction CREATE TABLE. Cette fonctionnalité ne s’active pas en ajoutant l’option dans la déclaration de colonne. Une intervention manuelle est nécessaire pour obtenir le même comportement que dans SQL Server.

Exemple de code

Code d’entrée :
 CREATE TABLE TABLE1
( 
  [COL1] nvarchar MASKED WITH (FUNCTION = 'default()') NULL,
  [COL2] varchar(100) MASKED WITH (FUNCTION = 'partial(1, "xxxxx", 1)') NULL,
  [COL3] varchar(100) MASKED WITH (FUNCTION = 'email()') NOT NULL,
  [COL4] smallint MASKED WITH (FUNCTION = 'random(1, 100)') NULL
);
Code généré :
 CREATE OR REPLACE TABLE TABLE1
(
  COL1 VARCHAR
               !!!RESOLVE EWI!!! /*** SSC-EWI-TS0017 - COLUMN MASKING NOT SUPPORTED IN CREATE TABLE ***/!!!
               MASKED WITH (FUNCTION = 'default()') NULL,
  COL2 VARCHAR(100)
                    !!!RESOLVE EWI!!! /*** SSC-EWI-TS0017 - COLUMN MASKING NOT SUPPORTED IN CREATE TABLE ***/!!!
 MASKED WITH (FUNCTION = 'partial(1, "xxxxx", 1)') NULL,
  COL3 VARCHAR(100)
                    !!!RESOLVE EWI!!! /*** SSC-EWI-TS0017 - COLUMN MASKING NOT SUPPORTED IN CREATE TABLE ***/!!!
 MASKED WITH (FUNCTION = 'email()') NOT NULL,
  COL4 SMALLINT
                !!!RESOLVE EWI!!! /*** SSC-EWI-TS0017 - COLUMN MASKING NOT SUPPORTED IN CREATE TABLE ***/!!!
                MASKED WITH (FUNCTION = 'random(1, 100)') NULL
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
;

Meilleures pratiques

SnowConvert AI ne génère pas de MASKING POLICIES dans la version actuelle. Elles doivent donc être créées manuellement. Par ex. :

La première étape consiste à créer un rôle d’administrateur pour la politique de masquage.

 create role masking_admin;

La deuxième étape consiste à accorder les privilèges nécessaires au rôle créé.

 grant create masking policy on schema PUBLIC to role masking_admin;
allow table_owner role to set or unset the ssn_mask masking policy -- (optional)
grant apply on masking policy ssn_mask to role table_owner;

L’étape suivante consiste à créer les fonctions de la politique de masquage.

 -- default mask
create or replace masking policy default_mask as (val string) returns string ->
case
when current_role() in ('ANALYST') then val
else 'xxxx'
end;

-- partial mask
create or replace masking policy partial_mask as (val string) returns string ->
case
when current_role() in ('ANALYST') then val
else LEFT(val,1) || 'xxxxx' || RIGHT(val,1)
end;

-- email mask
create or replace masking policy email_mask as (val string) returns string ->
case
when current_role() in ('ANALYST') then val
else LEFT(val,1) || 'XXX@XXX.com'
end;

-- random mask
create or replace masking policy random_mask as (val smallint) returns smallint ->
case
when current_role() in ('ANALYST') then val
else UNIFORM(1,100,RANDOM())::SMALLINT
end;

Note

À titre indicatif, nous prenons quelques exemples de fonctions de masquage dans SQL Server, et nous les traduisons manuellement en leur équivalent dans Snowflake.

L’étape finale consiste à ajouter la politique de masquage à la colonne qui avait à l’origine l’option de masquage dans SQL Server.

 alter table if exists TABLE1 modify column COL1 set masking policy default_mask;
alter table if exists TABLE1 modify column COL2 set masking policy partial_mask;
alter table if exists TABLE1 modify column COL3 set masking policy email_mask;
alter table if exists TABLE1 modify column COL4 set masking policy random_mask;

Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.

SSC-EWI-TS0023

Option Bulk non prise en charge

Gravité

Faible

Note

Certaines parties du code de sortie sont omises pour des raisons de clarté.

Description

Cet EWI est ajouté lorsqu’une option dans une instruction BULK INSERT n’a pas pu être mappée. Les options Bulk traduites doivent être reflétées en tant qu’options FILE FORMAT.

Exemple de code

Code d’entrée :
 BULK INSERT #PCE FROM 'E:\PCE_Look-up_table.txt'  
WITH   
(  
   FIELDTERMINATOR ='\t',
   ROWTERMINATOR ='\n',
   FIRE_TRIGGERS 
);
Code généré :
 CREATE OR REPLACE FILE FORMAT FILE_FORMAT_638461199649565070
FIELD_DELIMITER = '\t'
RECORD_DELIMITER = '\n'
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0023 - 'FIRE_TRIGGERS' BULK OPTION COULD NOT BE TRANSFORMED TO ANY OF THE EXISTING FILE FORMAT OPTIONS ***/!!!
FIRE_TRIGGERS;

CREATE OR REPLACE STAGE STAGE_638461199649565070
FILE_FORMAT = FILE_FORMAT_638461199649565070;

--** SSC-FDM-TS0004 - PUT STATEMENT IS NOT SUPPORTED ON WEB UI. YOU SHOULD EXECUTE THE CODE THROUGH THE SNOWFLAKE CLI **
PUT file://E:\PCE_Look-up_table.txt @STAGE_638461199649565070 AUTO_COMPRESS = FALSE;

COPY INTO T_PCE FROM @STAGE_638461199649565070/PCE_Look-up_table.txt;

Meilleures pratiques

  • Consultez le [guide de l’utilisateur] de SnowSQL CLI (https://docs.snowflake.com/fr/user-guide/snowsql.html).

  • Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.

connexesEWI

  1. SSC-FDM-TS0004 : instruction PUT non prise en charge sur l’UI.

SSC-EWI-TS0024

Transformation incomplète pour Bulk Insert

Gravité

Faible

Description

Cet EWI est ajouté lorsqu’une instruction BULK INSERT à l’intérieur d’une procédure stockée n’a pas été identifiée du tout. Ainsi, les dépendances pour la transformation complète ne seront pas générées. Par ailleurs, l’instruction COPY INTO transformée récupère le fichier à partir d’une tempStage qui doit être créée manuellement.

Exemple de code

Code d’entrée :
 CREATE PROCEDURE BULK_PROC2
AS
BULK INSERT dbo.table1 FROM 'E:\test.txt'  
WITH   
(  
   FIELDTERMINATOR ='\t',
   ROWTERMINATOR ='\n'
); 

GO
Code généré :
 CREATE OR REPLACE FILE FORMAT FILE_FORMAT_638461207064166040
FIELD_DELIMITER = '\t'
RECORD_DELIMITER = '\n';

CREATE OR REPLACE STAGE STAGE_638461207064166040
FILE_FORMAT = FILE_FORMAT_638461207064166040;

--** SSC-FDM-TS0004 - PUT STATEMENT IS NOT SUPPORTED ON WEB UI. YOU SHOULD EXECUTE THE CODE THROUGH THE SNOWFLAKE CLI **
PUT file://E:\test.txt @STAGE_638461207064166040 AUTO_COMPRESS = FALSE;

CREATE OR REPLACE PROCEDURE BULK_PROC2 ()
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
EXECUTE AS CALLER
AS
$$
   // REGION SnowConvert AI Helpers Code
   // END REGION

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

Meilleures pratiques

SSC-EWI-TS0025

Fonction ERROR_SEVERITY transformée

Gravité

Faible

Note

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

Note

Certaines parties du code de sortie sont omises pour des raisons de clarté.

Description

Cet EWI est ajouté lorsque la fonction intégrée ERROR_SEVERITY est traduite. Par défaut, la fonction renverra 16, car il s’agit de la gravité la plus courante dans SQL Server. L’UDF générée devrait procéder à une récupération.

Exemple de code

Code d’entrée :
 -- Additional Params: -t JavaScript
CREATE procedure proc1()
as
BEGIN TRY  
    -- Generate a divide-by-zero error.  
    SELECT 1/0 from table1;  
END TRY  
BEGIN CATCH  
    return ERROR_SEVERITY();  
END CATCH;  
GO  
Code généré :
 CREATE OR REPLACE PROCEDURE proc1 ()
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
EXECUTE AS CALLER
AS
$$
    // SnowConvert AI Helpers Code section is omitted.

    try {
        EXEC(`    -- Generate a divide-by-zero error.  
    SELECT
       TRUNC( 1/0) from
       table1`);
    } catch(error) {
        return SELECT(`   !!!RESOLVE EWI!!! /*** SSC-EWI-TS0025 - CUSTOM UDF 'ERROR_SEVERITY_UDF' INSERTED FOR ERROR_SEVERITY FUNCTION. ***/!!!
   ERROR_SEVERITY_UDF()`);
    }
$$;

Meilleures pratiques

SSC-EWI-TS0026

Requête With Delete transformée en Create Table.

Gravité

Faible

Description

Cet EWI est ajouté lorsqu’une expression de table commune avec une clause Delete From est transformée en une clause Create ou Replace Table.

Exemple de code

Code d’entrée :
 WITH Duplicated AS (
SELECT *, ROW_NUMBER() OVER (PARTITION BY ID ORDER BY ID) AS RN
FROM WithQueryTest
)
DELETE FROM Duplicated
WHERE Duplicated.RN > 1
Code généré :
 !!!RESOLVE EWI!!! /*** SSC-EWI-TS0026 - WITH DELETE QUERY TURNED TO CREATE TABLE ***/!!!
CREATE OR REPLACE TABLE WithQueryTest AS
SELECT
*
FROM
WithQueryTest
QUALIFY
ROW_NUMBER()
OVER (PARTITION BY
ID
ORDER BY ID) = 1;

Meilleures pratiques

  • Aucune autre action de l’utilisateur n’est requise.

  • Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.

SSC-EWI-TS0032

Bulk Insert partiellement traduite

Avertissement

L’EWI n’est généré que lorsque Javascript est le langage cible pour les procédures stockées. Il s’agit d’une fonctionnalité de traduction obsolète, car l’Exécution de scripts Snowflake est le langage cible recommandé pour les procédures stockées.

Gravité

Élevé

Note

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

Note

Certaines parties du code de sortie sont omises pour des raisons de clarté.

Description

Cet EWI est ajouté à un littéral qui était à l’origine une concaténation, alors que le code contenu comprenait une instruction BULK INSERT. La commande PUT résultant de la traduction de BULK INSERT n’est pas prise en charge lors de l’exécution du code qui était à l’origine un SQL dynamique.

C’est pourquoi la commande PUT doit être extraite du code de sortie et exécutée manuellement en dehors de la procédure qui la contient. Gardez à l’esprit que s’il existe beaucoup d’instructions BULK INSERT dans les phrases SQL dynamiques de la procédure, il est conseillé de diviser cette procédure pour pouvoir exécuter manuellement la commande PUT correspondante pour chaque instruction BULK INSERT traduite.

Exemple de code

Code d’entrée :
 -- Additional Params: -t JavaScript
CREATE PROCEDURE  [dbo].[Load_FuelMgtMasterData]
AS
    BEGIN
        SET NOCOUNT ON;

        DECLARE
            @SQLString VARCHAR(500)
        ,   @ImportName VARCHAR(200)
        ,   @Today DATE
        ,   @Yesterday DATE
        ,   @SourceAffiliates VARCHAR(200);

        SET @Today = GETDATE();
        SET @Yesterday = DATEADD(DAY, -1, @Today);
        TRUNCATE TABLE dbo.SourceFM_Affiliates;
        SET @ImportName = '\\' + +@@ServerName
            + '\WorkA\merchantportal\affiliates.txt';
        SET @SQLString = 'BULK INSERT ' + @SourceAffiliates + ' FROM '''
            + @ImportName + '''';
        EXEC (@SQLString);
    END;
Code généré :
 CREATE OR REPLACE PROCEDURE dbo.Load_FuelMgtMasterData ()
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
EXECUTE AS CALLER
AS
$$
    // SnowConvert AI Helpers Code section is omitted.

    /*** SSC-EWI-0040 - THE 'SET' CLAUSE IS NOT SUPPORTED IN SNOWFLAKE ***/
    /*        SET NOCOUNT ON*/
    ;
    let SQLSTRING;
    let IMPORTNAME;
    let TODAY;
    let YESTERDAY;
    let SOURCEAFFILIATES;
    TODAY = SELECT(`   CURRENT_TIMESTAMP() :: TIMESTAMP`);
    YESTERDAY = SELECT(`   DATEADD(DAY, -1, ?)`,[TODAY]);
    EXEC(`        TRUNCATE TABLE dbo.SourceFM_Affiliates`);
    IMPORTNAME = `\\` + SERVERNAME + `\WorkA\merchantportal\affiliates.txt`;
    SQLSTRING =
        // ** SSC-EWI-TS0032 - THE BULK INSERT WAS PART OF A DYNAMIC SQL, WHICH MAKES SOME OF THE TRANSLATED ELEMENTS INVALID UNLESS EXECUTED OUTSIDE DYNAMIC CODE. **
        `CREATE OR REPLACE FILE FORMAT FILE_FORMAT_638923328992788100;

CREATE OR REPLACE STAGE STAGE_638923328992788100
FILE_FORMAT = FILE_FORMAT_638923328992788100;

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

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

Meilleures pratiques

  • Extrayez la commande PUT résultant de l’instruction dynamique BULK INSERT, puis exécutez-la avant d’appeler la procédure.

  • Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.

SSC-EWI-TS0034

Clause RETURNS incomplète en raison de symboles manquants

Gravité

Élevé

Description

Cet EWI est ajouté au code de sortie lorsque la clause RETURNS TABLE d’une FUNCTION CREATE n’a pas pu être générée correctement. Cela se produit lorsque les colonnes qui doivent être spécifiées dans la clause RETURNS TABLE résultante ne peut pas être inférée par SnowConvert AI, laissant ainsi la clause RETURNS TABLE vide.

Exemple de code

Code d’entrée :
 CREATE FUNCTION Sales.ufn_SalesByStore2()
RETURNS TABLE
AS
RETURN
(
  WITH CTE AS (
  SELECT DepartmentID, Name, GroupName
  FROM HumanResources.Department
  )
  SELECT tab.* FROM CTE tab
);

GO

SELECT * FROM GetDepartmentInfo();
Code généré :
 --** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "HumanResources.Department" **
CREATE OR REPLACE FUNCTION Sales.ufn_SalesByStore2 ()
RETURNS TABLE(
  DepartmentID STRING /*** SSC-FDM-TS0012 - INFORMATION FOR THE COLUMN DepartmentID WAS NOT FOUND. STRING DATATYPE USED TO MATCH CAST AS STRING OPERATION ***/,
  Name STRING /*** SSC-FDM-TS0012 - INFORMATION FOR THE COLUMN Name WAS NOT FOUND. STRING DATATYPE USED TO MATCH CAST AS STRING OPERATION ***/,
  GroupName STRING /*** SSC-FDM-TS0012 - INFORMATION FOR THE COLUMN GroupName WAS NOT FOUND. STRING DATATYPE USED TO MATCH CAST AS STRING OPERATION ***/
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "transact",  "convertedOn": "07/14/2025",  "domain": "no-domain-provided" }}'
AS
$$
  --** SSC-PRF-TS0001 - PERFORMANCE WARNING - RECURSION FOR CTE NOT CHECKED. MIGHT REQUIRE RECURSIVE KEYWORD **
    WITH CTE AS (
    SELECT
      DepartmentID,
      Name,
      GroupName
    FROM
      HumanResources.Department
    )
    SELECT tab.* FROM
    CTE tab
$$;

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

SELECT
    *
FROM
    TABLE(GetDepartmentInfo());

Meilleures pratiques

  • Les causes de ce problème peuvent varier. Veillez à inclure tous les objets dont votre code a besoin. Si le problème persiste alors que la migration a accès à tous les objets nécessaires, veuillez nous contacter avec des informations sur votre scénario spécifique.

  • Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.

SSC-EWI-TS0035

La déclaration d’une variable de curseur qui n’est jamais initialisée n’est pas prise en charge.

Gravité

Medium

Note

Certaines parties du code de sortie sont omises pour des raisons de clarté.

Description

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

Exemple de code

Code d’entrée :
 CREATE OR ALTER PROCEDURE notInitializedCursorTest
AS
BEGIN
    -- Should be marked with SSC-EWI-TS0035
    DECLARE @MyCursor CURSOR, @MyCursor2 CURSOR;
    -- Should not be marked
    DECLARE cursorVar CURSOR FORWARD_ONLY STATIC READ_ONLY
        FOR
        SELECT someCol
        FROM someTable;
    RETURN 'DONE';
END;
Code généré :
 CREATE OR REPLACE PROCEDURE notInitializedCursorTest ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
EXECUTE AS CALLER
AS
$$
    DECLARE
        -- Should be marked with SSC-EWI-TS0035
        !!!RESOLVE EWI!!! /*** SSC-EWI-TS0035 - CURSOR VARIABLE DECLARED BUT NEVER INITIALIZED, THIS IS NOT SUPPORTED IN SNOWFLAKE SCRIPTING ***/!!!
        MYCURSOR CURSOR;
        !!!RESOLVE EWI!!! /*** SSC-EWI-TS0035 - CURSOR VARIABLE DECLARED BUT NEVER INITIALIZED, THIS IS NOT SUPPORTED IN SNOWFLAKE SCRIPTING ***/!!!
        MYCURSOR2 CURSOR;
        -- Should not be marked
        cursorVar CURSOR
        FOR
            SELECT
                someCol
            FROM
                someTable;
    BEGIN
         
         
        RETURN 'DONE';
    END;
$$;

Meilleures pratiques

SSC-EWI-TS0036

L’Exécution de scripts Snowflake ne prend en charge que les curseurs locaux.

Gravité

Medium

Note

Certaines parties du code de sortie sont omises pour des raisons de clarté.

Description

Cet EWI est ajouté lorsque des curseurs autres que des curseurs locaux sont identifiés. Actuellement, l’Exécution de scripts Snowflake ne prend en charge que les curseurs locaux. Ainsi, tous les curseurs sont traduits en tant que curseurs locaux.

Exemple de code

Code d’entrée :
 CREATE OR ALTER PROCEDURE globalCursorTest
AS
BEGIN
    -- Should be marked with SSC-EWI-TS0036
    DECLARE MyCursor CURSOR GLOBAL STATIC READ_ONLY
        FOR
        SELECT *
        FROM exampleTable;
    -- Should not be marked
    DECLARE MyCursor2 CURSOR LOCAL STATIC READ_ONLY
        FOR
        SELECT testCol
        FROM myTable;
    RETURN 'DONE';
END;
 CREATE OR REPLACE PROCEDURE globalCursorTest ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
EXECUTE AS CALLER
AS
$$
    DECLARE
        -- Should be marked with SSC-EWI-TS0036
        !!!RESOLVE EWI!!! /*** SSC-EWI-TS0036 - SNOWFLAKE SCRIPTING ONLY SUPPORTS LOCAL CURSORS ***/!!!
        MyCursor CURSOR
        FOR
            SELECT
                *
            FROM
                exampleTable;
        -- Should not be marked
        MyCursor2 CURSOR
        FOR
            SELECT
                testCol
            FROM
                myTable;
    BEGIN
         
         
        RETURN 'DONE';
    END;
$$;
 

Meilleures pratiques

SSC-EWI-TS0037

Les curseurs de l’Exécution de scripts Snowflake ne peuvent pas être déroulés.

Gravité

Medium

Note

Certaines parties du code de sortie sont omises pour des raisons de clarté.

Description

Les curseurs de l’Exécution de scripts Snowflake ne peuvent pas être déroulés. Actuellement, seul FETCH NEXT est pris en charge.

Exemple de code

Code d’entrée :
 CREATE OR ALTER PROCEDURE scrollablecursorTest
AS
BEGIN
    -- Should be marked with SSC-EWI-TS0037
    DECLARE CursorVar CURSOR SCROLL STATIC READ_ONLY
	FOR  
	SELECT FirstName
	FROM vEmployee;
    -- Should not be marked
    DECLARE CursorVar2 CURSOR STATIC READ_ONLY
	FOR  
	SELECT FirstName
	FROM vEmployee;
    DECLARE CursorVar3 CURSOR FORWARD_ONLY STATIC READ_ONLY
	FOR  
	SELECT FirstName
	FROM vEmployee;
    RETURN 'DONE';
END;
Code généré :
 CREATE OR REPLACE PROCEDURE scrollablecursorTest ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
EXECUTE AS CALLER
AS
$$
	DECLARE
		-- Should be marked with SSC-EWI-TS0037
		!!!RESOLVE EWI!!! /*** SSC-EWI-TS0037 - SNOWFLAKE SCRIPTING CURSORS ARE NON-SCROLLABLE, ONLY FETCH NEXT IS SUPPORTED ***/!!!
		CursorVar CURSOR
		FOR
			SELECT
				FirstName
			FROM
				vEmployee;
		-- Should not be marked
		CursorVar2 CURSOR
		FOR
			SELECT
				FirstName
			FROM
				vEmployee;
		CursorVar3 CURSOR
		FOR
			SELECT
				FirstName
			FROM
				vEmployee;
	BEGIN
		 
		 
		 
		RETURN 'DONE';
	END;
$$;

Meilleures pratiques

SSC-EWI-TS0039

Plusieurs instructions SET pour le même curseur ont été trouvées.

Gravité

Medium

Description

Cet EWI est ajouté lorsque plusieurs instructions SET pour le même curseur sont trouvées. Toutes les instructions SET sont également commentées. Cela se produit, car avoir plusieurs instructions SET pour le même curseur n’est pas valide dans l’Exécution de scripts Snowflake.

Exemple de code :

Cet EWI est ajouté lorsque plusieurs instructions SET pour le même curseur sont trouvées. Toutes les instructions SET sont également commentées. Cela se produit, car avoir plusieurs instructions SET pour le même curseur n’est pas valide dans l’Exécution de scripts Snowflake.

Exemple de code :

Code d’entrée :
 CREATE OR ALTER PROCEDURE multipleSetExample
AS
BEGIN
    DECLARE @MyCursor CURSOR;
    DECLARE @MyCursor2 CURSOR STATIC READ_ONLY
	FOR  
	SELECT FirstName
	FROM vEmployee;
    DECLARE @MyCursor3 CURSOR;
    
    SET @MyCursor = CURSOR STATIC READ_ONLY
        FOR
        SELECT col3
        FROM defaultTable;
        
    SET @MyCursor3 = CURSOR STATIC READ_ONLY
    FOR
    SELECT *
    FROM someTable;
    
    SET @MyCursor = CURSOR DYNAMIC
        FOR
        SELECT col2
        FROM exampleTable;
        
    SET @MyCursor2 = CURSOR STATIC READ_ONLY
        FOR
        SELECT col3
        FROM defaultTable;
        
    RETURN 'DONE';
END;
Code généré :
 CREATE OR REPLACE PROCEDURE multipleSetExample ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
EXECUTE AS CALLER
AS
$$
	DECLARE
		MYCURSOR CURSOR
		FOR
			SELECT col3
			FROM defaultTable;
		MYCURSOR2 CURSOR
		FOR
			SELECT
				FirstName
			FROM
				vEmployee;
		MYCURSOR3 CURSOR
		FOR
			SELECT *
			FROM someTable;
	BEGIN
		 
		 
		 
		 
		 
		DECLARE
		MYCURSOR CURSOR
		FOR
			SELECT col3
			FROM defaultTable;
		MYCURSOR2 CURSOR
		FOR
			SELECT
				FirstName
			FROM
				vEmployee;
		MYCURSOR3 CURSOR
		FOR
			SELECT *
			FROM someTable;
	BEGIN
		 
		 
		 
		 
		 
		!!!RESOLVE EWI!!! /*** SSC-EWI-0040 - THE 'SET CURSOR' CLAUSE IS NOT SUPPORTED IN SNOWFLAKE ***/!!!!!!RESOLVE EWI!!! /*** SSC-EWI-TS0039 - CURSOR VARIABLE MYCURSOR SET MULTIPLE TIMES, THIS IS NOT VALID IN SNOWFLAKE SCRIPTING ***/!!!

		SET @MyCursor = CURSOR DYNAMIC
		    FOR
		    SELECT col2
		    FROM exampleTable;
		!!!RESOLVE EWI!!! /*** SSC-EWI-0040 - THE 'SET CURSOR' CLAUSE IS NOT SUPPORTED IN SNOWFLAKE ***/!!!!!!RESOLVE EWI!!! /*** SSC-EWI-TS0039 - CURSOR VARIABLE MYCURSOR2 SET MULTIPLE TIMES, THIS IS NOT VALID IN SNOWFLAKE SCRIPTING ***/!!!

    SET @MyCursor2 = CURSOR STATIC READ_ONLY
        FOR
        SELECT col3
        FROM defaultTable;
		RETURN 'DONE';
	END;
$$;

Meilleures pratiques

SSC-EWI-TS0041

Les méthodes des types de données XML ne sont pas prises en charge dans Snowflake.

Gravité

Medium

Description

Cet EWI est ajouté pour les méthodes des types de données XML qui ne sont pas prises en charge dans Snowflake SQL :

  • Valeur

  • Requête

  • Existe

  • Modifier

  • Nœuds

Exemple de code

Code d’entrée :
 CREATE PROCEDURE xml_procedure
    @inUserGroupsXML XML
AS
BEGIN
    SELECT  entities.entity.value('TypeID[1]', 'VARCHAR(100)') AS TypeID
        ,entities.entity.value('Name[1]', 'VARCHAR(100)') AS Name
    INTO  #tmpUserGroups
    FROM  @inUserGroupsXML.nodes('/entities/entity') entities(entity)
END;
Code généré :
 CREATE OR REPLACE PROCEDURE xml_procedure (INUSERGROUPSXML TEXT)
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
EXECUTE AS CALLER
AS
$$
    BEGIN
        CREATE OR REPLACE TEMPORARY TABLE T_tmpUserGroups AS
            SELECT
                XMLGET(entity, '$') :: VARCHAR(100) AS TypeID
                ,
                XMLGET(entity, '$') :: VARCHAR(100) AS Name
            FROM
                !!!RESOLVE EWI!!! /*** SSC-EWI-TS0041 - XML TYPE METHOD nodes IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
                T_inUserGroupsXML('/entities/entity') entities (
                    entity
                );
    END;
$$;

Meilleures pratiques

  • Envisagez d’utiliser des UDFs pour émuler le comportement du code source.

  • Vous pouvez consulter cette documentation et examiner quelques approches possibles pour travailler avec les types de données XML dans Snowflake.

  • Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.

SSC-EWI-TS0043

WITH XMLNAMESPACES n’est pas pris en charge dans Snowflake.

Gravité

Medium

Note

Certaines parties du code de sortie sont omises pour des raisons de clarté.

Description

Cet EWI est ajouté pour la clause WITH XMLNAMESPACES qui n’est pas prise en charge dans Snowflake SQL.

Exemple de code

Code d’entrée :
 WITH XMLNAMESPACES ('uri' as ns1)
SELECT ProductID as 'ns1:ProductID',
Name      as 'ns1:Name',
Color     as 'ns1:Color'
FROM Production.Product
WHERE ProductID = 316
FOR XML RAW, ELEMENTS XSINIL
Code généré :
 --** SSC-PRF-TS0001 - PERFORMANCE WARNING - RECURSION FOR CTE NOT CHECKED. MIGHT REQUIRE RECURSIVE KEYWORD **
WITH
     !!!RESOLVE EWI!!! /*** SSC-EWI-TS0043 - WITH XMLNAMESPACES IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
 XMLNAMESPACES ('uri' as VARIANT !!!RESOLVE EWI!!! /*** SSC-EWI-TS0015 - DATA TYPE NS1 IS NOT SUPPORTED IN SNOWFLAKE ***/!!! NOT NULL)
SELECT
ProductID AS "ns1:ProductID",
Name AS "ns1:Name",
Color AS "ns1:Color"
FROM
Production.Product
WHERE
ProductID = 316
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0044 - FOR XML RAW CLAUSE IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
FOR XML RAW, ELEMENTS XSINIL;

Meilleures pratiques

  • Envisagez d’utiliser des UDFs pour émuler le comportement du code source. Le code suivant fournit des suggestions d’UDFs qui peuvent être utilisées pour recréer le comportement d’origine :

SQL Server
 CREATE  TABLE PRODUCT (ProductID INTEGER, Name VarChar(20), Color VarChar(20));
INSERT INTO PRODUCT(PRODUCTID, NAME, COLOR) VALUES(1,'UMBRELLA','RED');
INSERT INTO PRODUCT(PRODUCTID, NAME, COLOR) VALUES(2,'SHORTS','BLUE');
INSERT INTO PRODUCT(PRODUCTID, NAME, COLOR) VALUES(3,'BALL','YELLOW');

WITH XMLNAMESPACES ('uri' as ns1)  
SELECT ProductID as 'ns1:ProductID',  
       Name      as 'ns1:Name',  
       Color     as 'ns1:Color'  
FROM Product  
FOR XML RAW
Snowflake SQL
 CREATE OR REPLACE TABLE PRODUCT (
       ProductID INTEGER,
       Name VARCHAR(20),
       Color VARCHAR(20))
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "transact",  "convertedOn": "07/12/2024" }}'
;

INSERT INTO PRODUCT (PRODUCTID, NAME, COLOR) VALUES(1,'UMBRELLA','RED');
INSERT INTO PRODUCT (PRODUCTID, NAME, COLOR) VALUES(2,'SHORTS','BLUE');
INSERT INTO PRODUCT (PRODUCTID, NAME, COLOR) VALUES(3,'BALL','YELLOW');

--** SSC-PRF-TS0001 - PERFORMANCE WARNING - RECURSION FOR CTE NOT CHECKED. MIGHT REQUIRE RECURSIVE KEYWORD **

WITH
     !!!RESOLVE EWI!!! /*** SSC-EWI-TS0043 - WITH XMLNAMESPACES IS NOT SUPPORTED IN SNOWFLAKE ***/!!! XMLNAMESPACES ('uri' as ns1)
SELECT
       ProductID AS "ns1:ProductID",
       Name AS "ns1:Name",
       Color AS "ns1:Color"
FROM
       Product
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0044 - FOR XML RAW CLAUSE IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
FOR XML RAW;

connexesEWI

  1. SSC-PRF-TS0001 : Avertissement lié aux performances - Récursivité pour la CTE non vérifiée. Peut nécessiter un mot-clé récursif.

  2. SSC-EWI-TS0044 : la clause FOR XML n’est pas prise en charge dans Snowflake.

  3. SSC-EWI-TS0015 : type de données non pris en charge dans Snowflake.

SSC-EWI-TS0044

La clause FOR XML n’est pas prise en charge dans Snowflake.

Gravité

Critique

Note

Certaines parties du code de sortie sont omises pour des raisons de clarté.

Description

Cet EWI est ajouté pour la clause FOR XML qui n’est pas prise en charge dans Snowflake SQL.

Exemple de code

Code d’entrée :
 SELECT TOP 1 LastName
FROM AdventureWorks2019.Person.Person
FOR XML AUTO;
Code généré :
 SELECT TOP 1
LastName
FROM
AdventureWorks2019.Person.Person
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0044 - FOR XML AUTO CLAUSE IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
FOR XML AUTO;

Meilleures pratiques

  • Envisagez d’utiliser des UDFs pour émuler le comportement du code source. Le code suivant fournit des suggestions d’UDFs qui peuvent être utilisées pour recréer le comportement d’origine :

SQL Server

Requête
 CREATE TABLE TEMPTABLE (Ref INT, Des NVARCHAR(100), Qty INT)

INSERT INTO tempTable VALUES (100001, 'Normal', 1), (100002, 'Foobar', 1), (100003, 'Hello World', 2)

GO

-- FOR XML
SELECT *
FROM TempTable
FOR XML AUTO

GO
 
-- FOR XML RAW
SELECT *
FROM TempTable
FOR XML RAW
Résultat
 -- FOR XML
<TempTable Ref="100001" Des="Normal" Qty="1"/><TempTable Ref="100002" Des="Foobar" Qty="1"/><TempTable Ref="100003" Des="Hello World" Qty="2"/>

-- FOR XML RAW
<row Ref="100001" Des="Normal" Qty="1"/><row Ref="100002" Des="Foobar" Qty="1"/><row Ref="100003" Des="Hello World" Qty="2"/>
Snowflake
Requête
 CREATE OR REPLACE TABLE TEMPTABLE (
Ref INT,
Des VARCHAR(100),
Qty INT
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
;

INSERT INTO tempTable VALUES (100001, 'Normal', 1), (100002, 'Foobar', 1), (100003, 'Hello World', 2);

-- FOR XML
SELECT
*
FROM
TempTable
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0044 - FOR XML AUTO CLAUSE IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
FOR XML AUTO;

-- FOR XML RAW
SELECT
*
FROM
TempTable
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0044 - FOR XML RAW CLAUSE IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
FOR XML RAW;
Résultat
 -- FOR XML
<TempTable DES="Normal" QTY="1" REF="100001"  /><TempTable DES="Foobar" QTY="1" REF="100002"  /><TempTable DES="Hello World" QTY="2" REF="100003"  />

-- FOR XML RAW
<row DES="Normal" QTY="1" REF="100001"  /><row DES="Foobar" QTY="1" REF="100002"  /><row DES="Hello World" QTY="2" REF="100003"  />

SSC-EWI-TS0045

L’instruction balisée n’est pas prise en charge dans l’Exécution de scripts Snowflake.

Gravité

Faible

Note

Certaines parties du code de sortie sont omises pour des raisons de clarté.

Description

This EWI is added when SnowConvert AI encounters a labeled statement in T-SQL that cannot be automatically transformed.

When GOTO/Label patterns appear inside a stored procedure with only forward jumps and top-level labels, SnowConvert AI automatically transforms them into nested procedure definitions with CALL/RETURN semantics — no EWI is emitted in those cases. See the LABEL and GOTO translation reference for details on the transformation.

This EWI is only emitted when the label cannot be transformed. This happens when the procedure contains a backward GOTO (one that targets a label appearing earlier in the source, which would require recursive calls), when labels appear inside anonymous blocks or UDFs (which do not support nested procedure definitions), or when labels are declared inside nested control flow blocks like IF, WHILE, or TRY (which cannot be extracted into nested procedures).

Exemple de code

The following example shows a backward GOTO pattern (retry logic) where the label RetryConnection appears before the GOTO that targets it, preventing automatic transformation:

Code d’entrée :
CREATE PROCEDURE dbo.RetryDatabaseConnection
AS
BEGIN
    DECLARE @Attempts INT = 0
RetryConnection:
    SET @Attempts = @Attempts + 1
    IF @Attempts < 3
        GOTO RetryConnection
    RETURN 0
END
Code généré :
CREATE OR REPLACE PROCEDURE dbo.RetryDatabaseConnection ()
RETURNS VARCHAR
LANGUAGE SQL
EXECUTE AS CALLER
AS
$$
  DECLARE
    ATTEMPTS INT := 0;
  BEGIN
    !!!RESOLVE EWI!!! /*** SSC-EWI-TS0045 - LABELED STATEMENT IS NOT SUPPORTED IN SNOWFLAKE SCRIPTING ***/!!!
    RetryConnection:
    ATTEMPTS := :ATTEMPTS + 1;
    IF (:ATTEMPTS < 3) THEN
      !!!RESOLVE EWI!!! /*** SSC-EWI-TS0087 - GOTO IS NOT SUPPORTED IN SNOWFLAKE. ***/!!!
      GOTO RetryConnection
    END IF;
    RETURN 0;
  END;
$$;

Meilleures pratiques

  • For backward GOTO patterns like retry logic, refactor the control flow to use WHILE or LOOP constructs instead.

  • For labels in anonymous blocks or UDFs, restructure the code into separate procedures or use IF/ELSE control flow.

  • Forward GOTO/Label patterns inside stored procedures are automatically transformed — no manual action is required for those cases.

  • Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.

SSC-EWI-TS0046

La table système n’est pas prise en charge dans Snowflake.

Gravité

Medium

Description

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

Exemple de code

Code d’entrée :
 SELECT *
FROM 
    sys.all_sql_modules
WHERE 
    [STATE] = 0; -- state must be ONLINE
Code généré :
 SELECT
    *
FROM
    !!!RESOLVE EWI!!! /*** SSC-EWI-TS0046 - SYSTEM TABLE sys.all_sql_modules IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
    sys.all_sql_modules
WHERE
    STATE = 0; -- state must be ONLINE

Meilleures pratiques

SSC-EWI-TS0047

Le message d’erreur RAISERROR peut différer à cause du format de chaîne SQL Server.

Note

Cet EWI est obsolète. Veuillez vous référer à la documentation SSC-FDM-TS0019.

Gravité

Faible

Description

Cet EWI est ajouté pour notifier que le message d’erreur RAISERROR peut différer à cause du format de chaîne SQL Server.

Exemple de code

Code d’entrée :
 CREATE PROCEDURE RAISERROR_PROCEDURE 
AS
BEGIN
RAISERROR ('This is a sample error message with the first parameter %d and the second parameter %*.*s',
           10, 
           1,
           123,
	   7,
	   7,
	   'param2');
END
Code généré :
 CREATE OR REPLACE PROCEDURE RAISERROR_PROCEDURE ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
EXECUTE AS CALLER
AS
$$
	BEGIN
		!!!RESOLVE EWI!!! /*** SSC-EWI-TS0047 - RAISERROR ERROR MESSAGE MAY DIFFER BECAUSE OF THE SQL SERVER STRING FORMAT ***/!!!
		SELECT
			RAISERROR_UDF('This is a sample error message with the first parameter %d and the second parameter %*.*s',
			10,
			1, array_construct(
			123,
7,
7,
'param2'));
	END;
$$;

Meilleures pratiques

SSC-EWI-TS0049

La traduction Multiple Line if Body devrait être disponible prochainement.

Note

Certaines parties du code de sortie sont omises pour des raisons de clarté.

Gravité

Medium

Description

La plupart des cas dans les instructions IF contenant un bloc Begin End dans leur corps sont pris en charge. Il s’agit d’un scénario réussi (pas de SSC-EWI-TS0049 généré).

Exemple de code

Code d’entrée :
 CREATE OR ALTER FUNCTION [PURCHASING].[FOO](@status INT)
Returns INT
As
Begin
    declare @result as int = 10;
    SELECT @result = quantity FROM TABLE1 WHERE COL1 = @status;
    IF @result = 3
    BEGIN
        IF @result>0 SELECT @result=0  ELSE SELECT @result=1
        SELECT @result = 1 
    END
    return @result;
End
Code généré :
 !!!RESOLVE EWI!!! /*** SSC-EWI-0068 - USER DEFINED FUNCTION WAS TRANSFORMED TO SNOWFLAKE PROCEDURE ***/!!!
--** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "TABLE1" **
CREATE OR REPLACE PROCEDURE PURCHASING.FOO (STATUS INT)
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "transact",  "convertedOn": "07/14/2025",  "domain": "no-domain-provided" }}'
EXECUTE AS CALLER
AS
$$
    DECLARE
        RESULT INT := 10;
    BEGIN
         
        SELECT
            quantity
        INTO
            :RESULT
        FROM
            TABLE1
        WHERE
            COL1 = :STATUS;
        IF (:RESULT = 3) THEN
            BEGIN
                IF (:RESULT >0) THEN SELECT
                        0
                    INTO
                        :RESULT;
                ELSE
                    SELECT
                        1
                    INTO
                        :RESULT;
                END IF;
        SELECT
                    1
                INTO
                    :RESULT;
            END;
        END IF;
        RETURN :RESULT;
    END;
$$;

Note

Dans un exemple de code général (comme celui ci-dessus), la conversion est correctement effectuée. Cependant, il existe des cas limites où l’instruction « IF » n’est pas convertie et où l’EWI sera généré.

Support manuel

Cas 1 : instruction unique

Pour ces cas, la transformation serait simple, car l’instruction transformée apparaîtrait dans une clause Select.

 IF @result = 0
BEGIN 
    SET @result =1
END
 CASE WHEN (SELECT RESULT FROM CTE2)= 0 THEN
( SELECT 1 AS RESULT )
Cas 2 : instructions multiples

Pour les cas où plusieurs instructions sont transformées, il convient de transformer l’instruction N et de l’utiliser comme table source pour l’instruction N+1.

 IF @result = 0
BEGIN 
    Statement1
    Statement2
    Statement3
END
 CASE WHEN (SELECT RESULT FROM CTE2)= 0 THEN
(
    SELECT TransformedStatement3
    FROM (
        SELECT TransformedStatement2
        FROM (
            SELECT TransformedStatement1
        ) T1
    ) T2
)
Cas 3 : instructions d’ensembles multiples

Pour ces cas, il sera nécessaire de répliquer une transformation pour chaque instruction Set.

 IF @result = 0
BEGIN 
    SET @var1 = 1
    SET @var2 = 3
    SET @var3 = @var2
END
 WITH CTE1 AS (
    SELECT 
        CASE WHEN (SELECT
                        RESULT
                    FROM
                        CTE0) = 0 THEN
        (SELECT 1) AS VAR1)
WITH CTE2 AS (
    SELECT
        CASE WHEN (SELECT
                        RESULT
                    FROM
                        CTE0)= 0 THEN
        (SELECT 3) AS VAR2)
WITH CTE3 AS (
    SELECT
        CASE WHEN (SELECT
                        RESULT
                    FROM
                        CTE0)= 0 THEN
        (SELECT T1.VAR2 
        FROM ((SELECT 3) AS VAR2) AS T1) AS VAR3) 
...

Meilleures pratiques

SSC-EWI-TS0055

La contrainte par défaut a été commentée et peut avoir été ajoutée à une définition de table.

Note

Cet EWI est obsolète. Veuillez vous référer à la documentation SSC-FDM-TS0020.

Gravité

Medium

Description

Cet EWI est ajouté lorsque la contrainte par défaut est présente dans une instruction Alter Table.

Actuellement, cette contrainte n’est pas prise en charge. Une solution de contournement permettant de la transformer consiste à définir préalablement la table avec Alter Table. De cette manière, nous identifions les références, et la contrainte par défaut est unifiée sur la définition de la table. Sinon, la contrainte est uniquement commentée.

Exemple de code

Code d’entrée :
 CREATE TABLE table1(
  col1 integer,
  col2 varchar collate Latin1_General_CS,
  col3 date
);

ALTER TABLE table1
ADD col4 integer,
  CONSTRAINT col1_constraint DEFAULT 50 FOR col1,
  CONSTRAINT col1_constraint DEFAULT 30 FOR col1;
Code généré :
 CREATE OR REPLACE TABLE table1 (
  col1 INTEGER DEFAULT 50,
  col2 VARCHAR COLLATE 'EN-CS',
  col3 DATE
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
;

ALTER TABLE table1
ADD col4 INTEGER,
  CONSTRAINT col1_constraint
                             !!!RESOLVE EWI!!! /*** SSC-EWI-TS0055 - DEFAULT CONSTRAINT MAY HAVE BEEN ADDED TO TABLE DEFINITION ***/!!!
                             DEFAULT 50 FOR col1,
  CONSTRAINT col1_constraint
                             !!!RESOLVE EWI!!! /*** SSC-EWI-TS0055 - DEFAULT CONSTRAINT MAY HAVE BEEN ADDED TO TABLE DEFINITION ***/!!!
                             DEFAULT 30 FOR col1;

Note

Si tout le contenu d’Alter Table n’est pas valide, Alter Table est commentée.

Problèmes connus

Lorsque différentes contraintes par défaut seront déclarées sur la même colonne, seule la première sera reflétée dans l’instruction Create Table.

Meilleures pratiques

SSC-EWI-TS0056

Une MASKING POLICY a été créée en tant que substitut pour MASKED WITH.

Note

Cet EWI est obsolète. Veuillez vous référer à la documentation SSC-FDM-TS0021.

Gravité

Faible

Note

Certaines parties du code de sortie sont omises pour des raisons de clarté.

Description

Cet EWI est ajouté lorsque l’instruction Alter Table contient une clause MASKED WITH. Celui-ci est ajouté pour indiquer qu’une valeur approximative MASKING POLICY a été créée en tant que substitut pour la fonction MASKED WITH.

Exemple de code

Code d’entrée :
 ALTER TABLE table_name
ALTER COLUMN column_name
ADD MASKED WITH (FUNCTION = 'default()');
Code généré :
 !!!RESOLVE EWI!!! /*** SSC-EWI-TS0057 - MASKING ROLE MUST BE DEFINED PREVIOUSLY BY THE USER ***/!!!
CREATE OR REPLACE MASKING POLICY "default" AS
(val STRING)
RETURNS STRING ->
CASE
WHEN current_role() IN ('YOUR_DEFINED_ROLE_HERE')
THEN val
ELSE 'xxxxx'
END;

ALTER TABLE IF EXISTS table_name MODIFY COLUMN column_name!!!RESOLVE EWI!!! /*** SSC-EWI-TS0056 - A MASKING POLICY WAS CREATED AS SUBSTITUTE FOR MASKED WITH ***/!!!  SET MASKING POLICY "default";

Note

La MASKING POLICY sera créée avant l’instruction ALTER TABLE. De plus, elle devrait avoir un comportement similaire. Quelques ajustements peuvent être nécessaires en ce qui concerne les rôles et les privilèges des utilisateurs. <!– TODO: You can relate to Broken link broken-reference « mention » for further details.>

Meilleures pratiques

SSC-EWI-TS0057

L’utilisateur doit préalablement définir le rôle de masquage.

Note

Cet EWI est obsolète. Veuillez vous référer à la documentation SSC-FDM-TS0022.

Gravité

Faible

Note

Certaines parties du code de sortie sont omises pour des raisons de clarté.

Description

Cet EWI se produit lorsqu’une MASKING POLICY est créée et qu’un rôle ou privilège doit y être lié pour que le masquage des données puisse fonctionner correctement.

Exemple de code

Code d’entrée
 ALTER TABLE tableName
ALTER COLUMN columnName
ADD MASKED WITH (FUNCTION = 'partial(1, "xxxxx", 1)');
Code généré :
 !!!RESOLVE EWI!!! /*** SSC-EWI-TS0057 - MASKING ROLE MUST BE DEFINED PREVIOUSLY BY THE USER ***/!!!
CREATE OR REPLACE MASKING POLICY "partial_1_xxxxx_1" AS
(val STRING)
RETURNS STRING ->
CASE
WHEN current_role() IN ('YOUR_DEFINED_ROLE_HERE')
THEN val
ELSE LEFT(val, 1) || 'xxxxx' || RIGHT(val, 1)
END;

ALTER TABLE IF EXISTS tableName MODIFY COLUMN columnName!!!RESOLVE EWI!!! /*** SSC-EWI-TS0056 - A MASKING POLICY WAS CREATED AS SUBSTITUTE FOR MASKED WITH ***/!!!  SET MASKING POLICY "partial_1_xxxxx_1";

Note

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

Meilleures pratiques

SSC-EWI-TS0060

Intervalle de date et d’heure non pris en charge par Snowflake.

Gravité

Medium

Description

Cet EWI est ajouté lorsque l’une des parties d’heure suivantes est utilisée comme paramètre pour une fonction liée à une date, car elles ne sont pas prises en charge dans Snowflake. Pour plus d’informations, accédez à « Parties de date et d’heure prises en charge » (Fonctions de date et d’heure | Documentation Snowflake).

Exemple de code

Code d’entrée
 SELECT
    -- Supported
    DATEPART(second, getdate()),
    -- Not supported
    DATEPART(millisecond, getdate()),
    DATEPART(microsecond, getdate());
Code généré :
 SELECT
    -- Supported
    DATE_PART(second, CURRENT_TIMESTAMP() :: TIMESTAMP),
    -- Not supported
    !!!RESOLVE EWI!!! /*** SSC-EWI-TS0060 - TIME PART 'millisecond' NOT SUPPORTED AS A FUNCTION PARAMETER ***/!!!
    DATEPART(millisecond, CURRENT_TIMESTAMP() :: TIMESTAMP),
    !!!RESOLVE EWI!!! /*** SSC-EWI-TS0060 - TIME PART 'microsecond' NOT SUPPORTED AS A FUNCTION PARAMETER ***/!!!
    DATEPART(microsecond, CURRENT_TIMESTAMP() :: TIMESTAMP);

Meilleures pratiques

  • Une UDF pourrait être créée pour extraire manuellement des parties d’heure non prises en charge dans Snowflake.

  • Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.

SSC-EWI-TS0061

ALTER COLUMN non pris en charge

Gravité

Medium

Note

Certaines parties du code de sortie sont omises pour des raisons de clarté.

Description

Cet EWI est ajouté chaque fois qu’il y a une instruction ALTER COLUMN non prise en charge.

Exemple de code

Code d’entrée :
 ALTER TABLE SampleTable
ALTER COLUMN SampleColumn INT NULL SPARSE;
Code généré :
 ALTER TABLE IF EXISTS SampleTable
ALTER COLUMN SampleColumn
                          !!!RESOLVE EWI!!! /*** SSC-EWI-TS0061 - ALTER COLUMN COMMENTED OUT BECAUSE SPARSE COLUMN IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
                          INT NULL SPARSE;

Meilleures pratiques

SSC-EWI-TS0063

Fuseau horaire non pris en charge dans Snowflake.

Gravité

Critique

Description

Cet EWI est ajouté lorsqu’il y a des fuseaux horaires qui ne sont pas pris en charge dans Snowflake.

Exemple de code

Code d’entrée :
 SELECT current_timestamp at time zone 'Turks And Caicos Standard Time';
Code généré :
 SELECT
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0063 - TIME ZONE NOT SUPPORTED IN SNOWFLAKE ***/!!!
CURRENT_TIMESTAMP() at time zone 'Turks And Caicos Standard Time'
                                                                 ;

Meilleures pratiques

  • Une fonction définie par l’utilisateur peut être créée pour prendre en charge plusieurs fuseaux horaires.

  • Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.

SSC-EWI-TS0067

Paramètres non valides dans la fonction à valeur de table OPENXML.

Gravité

Critique

Note

Certaines parties du code de sortie sont omises pour des raisons de clarté.

Description

Cet EWI est ajouté lorsqu’il y a des paramètres non valides dans l’OPENXML, en particulier lorsqu’il n’est pas possible d’accéder au chemin XML.

Pour éviter cet EWI, veuillez envoyer le chemin au nœud explicite via les paramètres.

Code d’entrée :
 SELECT
    *
FROM
    OPENXML (@idoc, @path, 1) WITH (
        CustomerID VARCHAR(10),
        ContactName VARCHAR(20)
    );
Code généré :
 SELECT
    *
FROM
    !!!RESOLVE EWI!!! /*** SSC-EWI-TS0067 - INVALID PARAMETERS IN OPENXML TABLE-VALUED FUNCTION ***/!!!
    OPENXML(@idoc, @path, 1);
Code d’entrée (paramètre explicite)
 SELECT
    *
FROM
    OPENXML (@idoc, '/ROOT/Customer', 1) WITH(
        CustomerID VARCHAR(10),
        ContactName VARCHAR(20)
    );
Code généré (paramètre explicite)
 SELECT
    Left(value:Customer['@CustomerID'], '10') AS 'CustomerID',
    Left(value:Customer['@ContactName'], '20') AS 'ContactName'
FROM
    OPENXML_UDF($idoc, ':ROOT:Customer');

Meilleures pratiques

  • Essayez de voir si le chemin peut être explicitement transmis en tant que paramètre.

  • Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.

SSC-EWI-TS0070

CURRENT_TIMESTAMP dans l’instruction At Time Zone peut avoir un comportement différent dans certains cas.

Note

Cet EWI est obsolète. Veuillez vous référer à la documentation SSC-FDM-TS0024.

Description

Cet EWI est ajouté lorsque At Time Zone contient le CURRENT_TIMESTAMP. En effet, des résultats différents peuvent survenir dans certains cas.

La principale différence est que dans SQL Server, CURRENT_TIMESTAMP renvoie la date et l’heure actuelles du système dans le fuseau horaire du serveur, tandis que dans Snowflake, CURRENT_TIMESTAMP renvoie la date et l’heure actuelles dans le fuseau horaire UTC (temps universel coordonné).

Code d’entrée :

SQL Server
 SELECT current_timestamp at time zone 'Hawaiian Standard Time';
Résultat

2024-02-08 16:52:55.317 -10:00

Code généré :
Snowflake
 SELECT
CONVERT_TIMEZONE('Pacific/Honolulu', CURRENT_TIMESTAMP() !!!RESOLVE EWI!!! /*** SSC-EWI-TS0070 - CURRENT_TIMESTAMP in At Time Zone statement may have a different behavior in certain cases ***/!!!);
Résultat

2024-02-08 06:53:46.994 -1000

Meilleures pratiques

Ceci est un exemple si vous souhaitez conserver le même format dans Snowflake.

SQL Server
 SELECT current_timestamp at time zone 'Hawaiian Standard Time';
Résultat

2024-02-08 16:33:49.143 -10:00

Dans Snowflake, vous pouvez utiliser ALTER SESSION pour modifier le fuseau horaire par défaut. Par exemple :

Snowflake
 ALTER SESSION SET TIMEZONE = 'Pacific/Honolulu';

SELECT
CONVERT_TIMEZONE('Pacific/Honolulu', 'UTC', CURRENT_TIMESTAMP());
Résultat

2024-02-08 16:33:49.143

SSC-EWI-TS0072

L’instruction RETURN sera ignorée en raison de la précédente instruction RETURN.

Gravité

Bas

Note

Certaines parties du code de sortie sont omises pour des raisons de clarté.

Description

Cet EWI est ajouté lorsque les instructions SELECT et les paramètres OUPUT doivent être renvoyés. Dans ce cas, les jeux de résultats des instructions SELECT sont prioritaires.

Code d’entrée :
 CREATE PROCEDURE SOMEPROC(@product_count INT OUTPUT,  @123 INT OUTPUT)
AS
BEGIN
		SELECT * from AdventureWorks.HumanResources.Department;
        SELECT * from AdventureWorks.HumanResources.Employee;
END
Code généré :
--** SSC-FDM-0007 - MISSING DEPENDENT OBJECTS "AdventureWorks.HumanResources.Department", "AdventureWorks.HumanResources.Employee" **
CREATE OR REPLACE PROCEDURE SOMEPROC (PRODUCT_COUNT OUT INT, _123 OUT INT)
RETURNS ARRAY
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "transact",  "convertedOn": "07/16/2025",  "domain": "no-domain-provided" }}'
EXECUTE AS CALLER
AS
$$
	DECLARE
		ProcedureResultSet1 VARCHAR;
		ProcedureResultSet2 VARCHAR;
		return_arr ARRAY := array_construct();
	BEGIN
		ProcedureResultSet1 := 'RESULTSET_' || REPLACE(UPPER(UUID_STRING()), '-', '_');
		CREATE OR REPLACE TEMPORARY TABLE IDENTIFIER(:ProcedureResultSet1) AS
			SELECT
				*
			from
				AdventureWorks.HumanResources.Department;
		return_arr := array_append(return_arr, :ProcedureResultSet1);
		ProcedureResultSet2 := 'RESULTSET_' || REPLACE(UPPER(UUID_STRING()), '-', '_');
		CREATE OR REPLACE TEMPORARY TABLE IDENTIFIER(:ProcedureResultSet2) AS
			SELECT
				*
			from
				AdventureWorks.HumanResources.Employee;
		return_arr := array_append(return_arr, :ProcedureResultSet2);
		--** SSC-FDM-0020 - MULTIPLE RESULT SETS ARE RETURNED IN TEMPORARY TABLES **
		RETURN return_arr;
	END;
$$;

Meilleures pratiques

  • Supprimez l’instruction RETURN qui doit être ignorée.

  • Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.

connexesEWI

  1. SSC-FDM-0020 : plusieurs jeux de résultats sont renvoyés dans des tables temporaires.

SSC-EWI-TS0073

Le message d’erreur pourrait être différent dans Snowflake.

Note

Cet EWI est obsolète. Veuillez vous référer à la documentation SSC-FDM-TS0023.

Gravité

Faible

Description

Cet EWI est ajouté dans la transformation de ERROR_MESSAGE(). Le message exact de l’erreur pourrait changer dans Snowflake.

Code d’entrée :
 SET @varErrorMessage = ERROR_MESSAGE()
Code généré
 BEGIN
VARERRORMESSAGE := SQLERRM !!!RESOLVE EWI!!! /*** SSC-EWI-TS0073 - ERROR MESSAGE COULD BE DIFFERENT IN SNOWFLAKE ***/!!!;
END;

Recommandation

Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.

SSC-EWI-TS0074

Le résultat de la conversion peut être différent de la fonction TRY_CAST/TRY_CONVERT en raison de dépendances manquantes.

Gravité

Faible

Note

Certaines parties du code de sortie sont omises pour des raisons de clarté.

Description

Cet EWI est ajouté dans la transformation des fonctions TRY_CAST et TRY_CONVERT. Le résultat exact de ces fonctions peut changer dans Snowflake en raison de dépendances manquantes (SnowConvert AI n’a pas pu résoudre certains types de données). Cela peut être dû au fait que la dépendance ne figurait pas dans le code source.

Code d’entrée :
 SELECT TRY_CONVERT( INT, col1) FROM TABLE1;

SELECT TRY_CAST(COL1 AS FLOAT) FROM TABLE1
Code généré
 SELECT
CAST(col1 AS INT) /*** SSC-FDM-TS0005 - TRY_CONVERT/TRY_CAST COULD NOT BE CONVERTED TO TRY_CAST ***/!!!RESOLVE EWI!!! /*** SSC-EWI-TS0074 - CAST RESULT MAY BE DIFFERENT FROM TRY_CONVERT FUNCTION DUE TO MISSING DEPENDENCIES ***/!!!
FROM
TABLE1;

SELECT
CAST(COL1 AS FLOAT) /*** SSC-FDM-TS0005 - TRY_CONVERT/TRY_CAST COULD NOT BE CONVERTED TO TRY_CAST ***/!!!RESOLVE EWI!!! /*** SSC-EWI-TS0074 - CAST RESULT MAY BE DIFFERENT FROM TRY_CAST FUNCTION DUE TO MISSING DEPENDENCIES ***/!!!
FROM
TABLE1;

Recommandation

Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.

SSC-EWI-TS0075

Procédure intégrée non prise en charge.

Gravité

Medium

Description

La traduction pour les procédures intégrées n’est pas prise en charge actuellement.

Exemple de code

Code d’entrée :
 EXEC sp_column_privileges_rowset_rmt 'Caption';
Code généré :
 !!!RESOLVE EWI!!! /*** SSC-EWI-TS0075 - TRANSLATION FOR BUILT-IN PROCEDURE 'sp_column_privileges_rowset_rmt' IS NOT CURRENTLY SUPPORTED. ***/!!!
EXEC sp_column_privileges_rowset_rmt 'Caption';

Meilleures pratiques

  • Aucune action de la part de l’utilisateur final n’est requise.

  • Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.

SSC-EWI-TS0076

Il peut être nécessaire de réorganiser les paramètres par défaut.

Note

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

Gravité

Medium

Description

Il peut être nécessaire de réorganiser les paramètres par défaut. Snowflake ne prend en charge les paramètres par défaut qu’à l’issue des déclarations de paramètres.

Exemple de code

Code d’entrée :
 CREATE PROCEDURE MySampleProc
    @Param1 NVARCHAR(50) = NULL,
    @Param2 NVARCHAR(10),
    @Param3 NVARCHAR(10) = NULL,
    @Param4 NVARCHAR(10)
AS   
    SELECT 1;
Code généré :
 !!!RESOLVE EWI!!! /*** SSC-EWI-TS0076 - DEFAULT PARAMETERS MAY NEED TO BE REORDERED. SNOWFLAKE ONLY SUPPORTS DEFAULT PARAMETERS AT THE END OF THE PARAMETERS DECLARATIONS. ***/!!!
CREATE OR REPLACE PROCEDURE MySampleProc (PARAM1 STRING DEFAULT NULL, PARAM2 STRING, PARAM3 STRING DEFAULT NULL, PARAM4 STRING)
RETURNS TABLE()
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
EXECUTE AS CALLER
AS
$$
    DECLARE
        ProcedureResultSet RESULTSET;
    BEGIN
        ProcedureResultSet := (
        SELECT 1);
        RETURN TABLE(ProcedureResultSet);
    END;
$$;

Meilleures pratiques

  • Aucune action de la part de l’utilisateur final n’est requise.

  • Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.

SSC-EWI-TS0077

Classement non pris en charge

Gravité

Faible

Description

Ce message s’affiche lorsqu’il existe une clause de classement qui n’est pas prise en charge dans Snowflake.

Exemple de code

Code d’entrée :
 SELECT 'a' COLLATE Albanian_BIN;

SELECT 'a' COLLATE Albanian_CI_AI;

CREATE TABLE ExampleTable (
    ID INT,
    Name VARCHAR(50) COLLATE collateName
);
Code généré :
 SELECT 'a'
--           !!!RESOLVE EWI!!! /*** SSC-EWI-TS0077 - COLLATION Albanian_BIN NOT SUPPORTED ***/!!!
-- COLLATE Albanian_BIN
                     ;

SELECT 'a'
--           !!!RESOLVE EWI!!! /*** SSC-EWI-TS0077 - COLLATION Albanian_CI_AI NOT SUPPORTED ***/!!!
-- COLLATE Albanian_CI_AI
                       ;

CREATE OR REPLACE TABLE ExampleTable (
    ID INT,
    Name VARCHAR(50)
--                     !!!RESOLVE EWI!!! /*** SSC-EWI-TS0077 - COLLATION collateName NOT SUPPORTED ***/!!!
-- COLLATE collateName
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"transact"}}'
;

Meilleures pratiques

  • Aucune autre action de l’utilisateur n’est requise.

  • Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.

SSC-EWI-TS0078

La valeur par défaut n’est pas autorisée dans Snowflake.

Gravité

Medium

Description

Cette erreur est ajoutée au code lorsque des expressions telles que des appels de fonctions, des noms de variables ou des constantes nommées suivent l’option par défaut.

Snowflake ne prend en charge que les constantes explicites telles que les nombres ou les chaînes.

Exemple de code

Code d’entrée :
 ALTER TABLE
    T_ALTERTABLETEST
ADD
    COLUMN COL10 INTEGER DEFAULT RANDOM(10);
Code généré :
 --** SSC-FDM-0007 - MISSING DEPENDENT OBJECTS "T_ALTERTABLETEST", "RANDOM" **
ALTER TABLE IF EXISTS T_ALTERTABLETEST
ADD
    COLUMN COL10 INTEGER
                         !!!RESOLVE EWI!!! /*** SSC-EWI-TS0078 - DEFAULT OPTION NOT ALLOWED IN SNOWFLAKE ***/!!!
                         DEFAULT RANDOM(10);

Meilleures pratiques

SSC-EWI-TS0079

La commande de console de base de données n’est pas prise en charge.

Gravité

Medium

Description

Cet EWI est ajouté lorsque SnowConvert AI trouve une instruction DBCC à l’intérieur du code d’entrée.\ La plupart des instructions DBCC ne sont pas prises en charge dans Snowflake.

Exemple de code

Code d’entrée :
 DBCC CHECKIDENT(@a, RESEED, @b) WITH NO_INFOMSGS
Code généré :
 !!!RESOLVE EWI!!! /*** SSC-EWI-TS0079 - DATABASE CONSOLE COMMAND 'CHECKIDENT' IS NOT SUPPORTED. ***/!!!
DBCC CHECKIDENT(@a, RESEED, @b) WITH NO_INFOMSGS;

Meilleures pratiques

  • Aucune action supplémentaire de la part de l’utilisateur n’est requise. Cet avertissement est simplement donné à titre informatif.

  • Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.

SSC-EWI-TS0080

La modification du contexte d’exécution au moment de l’exécution n’est pas prise en charge dans Snowflake.

Gravité

Élevé

Description

Les utilisateurs dans SQL Server peuvent utiliser la commande EXECUTE AS pour modifier temporairement le contexte d’exécution. Cela modifie les privilèges d’exécution et affecte les résultats des fonctions dépendantes du contexte comme USER_NAME(). La commande REVERT peut être utilisée pour restaurer le contexte précédent à la dernière commande EXECUTE AS.

Snowflake ne prend en charge que la définition d’un contexte d’exécution dans les procédures, en utilisant les instructions CREATE PROCEDURE ou ALTER PROCEDURE. La modification du contexte au moment de l’exécution n’est pas prise en charge.

Exemple de code

Code d’entrée :

 CREATE PROCEDURE proc1()
WITH EXECUTE AS OWNER
AS
BEGIN
	SELECT USER_NAME();
	EXECUTE AS CALLER;
	SELECT USER_NAME();
	REVERT;
	SELECT USER_NAME();
END

GO

Code de sortie :

 CREATE OR REPLACE PROCEDURE proc1 ()
RETURNS ARRAY
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "transact",  "convertedOn": "07/05/2024" }}'
EXECUTE AS OWNER
AS
$$
	DECLARE
		ProcedureResultSet1 VARCHAR;
		ProcedureResultSet2 VARCHAR;
		ProcedureResultSet3 VARCHAR;
		return_arr ARRAY := array_construct();
	BEGIN
		ProcedureResultSet1 := 'RESULTSET_' || REPLACE(UPPER(UUID_STRING()), '-', '_');
		CREATE OR REPLACE TEMPORARY TABLE IDENTIFIER(:ProcedureResultSet1) AS
			SELECT
				CURRENT_USER();
		return_arr := array_append(return_arr, :ProcedureResultSet1);
		!!!RESOLVE EWI!!! /*** SSC-EWI-TS0080 - CHANGING THE EXECUTION CONTEXT AT RUNTIME IS NOT SUPPORTED IN SNOWFLAKE. ***/!!!
	EXECUTE AS CALLER;
		ProcedureResultSet2 := 'RESULTSET_' || REPLACE(UPPER(UUID_STRING()), '-', '_');
		CREATE OR REPLACE TEMPORARY TABLE IDENTIFIER(:ProcedureResultSet2) AS
			SELECT
				CURRENT_USER();
		return_arr := array_append(return_arr, :ProcedureResultSet2);
		!!!RESOLVE EWI!!! /*** SSC-EWI-TS0080 - CHANGING THE EXECUTION CONTEXT AT RUNTIME IS NOT SUPPORTED IN SNOWFLAKE. ***/!!!
	REVERT;
		ProcedureResultSet3 := 'RESULTSET_' || REPLACE(UPPER(UUID_STRING()), '-', '_');
		CREATE OR REPLACE TEMPORARY TABLE IDENTIFIER(:ProcedureResultSet3) AS
			SELECT
				CURRENT_USER();
		return_arr := array_append(return_arr, :ProcedureResultSet3);
		--** SSC-FDM-0020 - MULTIPLE RESULT SETS ARE RETURNED IN TEMPORARY TABLES **
		RETURN return_arr;
	END;
$$;

Meilleures pratiques

  • Refactorisez le code de sorte qu’il fonctionne sans avoir à changer de contexte.

  • Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.

SSC-EWI-TS0081

L’utilisation d’une jointure complète dans une instruction de suppression n’est pas prise en charge.

Description

Lors de la transformation de l’instruction DELETE, SnowConvert AI extrait les références de table trouvées dans la clause FROM de l’instruction et les déplace vers la clause USING de l’instruction de suppression Snowflake.

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

Exemple de code

Code d’entrée :
DELETE Employees
FROM Employees FULL OUTER JOIN Departments
ON Employees.DepartmentID = Departments.DepartmentID
WHERE Departments.DepartmentID IS NULL;
Code généré :
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0081 - USING A FULL JOIN IN A DELETE STATEMENT IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
DELETE FROM
Employees
USING Departments
WHERE
Departments.DepartmentID IS NULL
AND Employees.DepartmentID = Departments.DepartmentID;

Meilleures pratiques

  • Vérifiez la logique de votre JOIN FULL. Il peut être possible de la réécrire sous un autre type de JOIN. Par exemple, le code inclus dans l’exemple de code est essentiellement le même qu’une JOIN LEFT :

Entrée :

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

Sortie :

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

SSC-EWI-TS0082

CROSS APPLY a été convertie en JOIN LEFT OUTER et nécessite une validation manuelle.

Description

Une validation manuelle est nécessaire, car la conversion de CROSS APPLY en JOIN LEFT OUTER peut entraîner des résultats incorrects ou un comportement inattendu dans Snowflake. Bien que les deux fonctions puissent paraître similaires, elles traitent certaines situations différemment, en particulier lorsque la sous-requête n’a pas de correspondance ou qu’elle est corrélée avec la table externe.

Exemple de code

Données de configuration
-- Create a table to store monthly sales or metric data
CREATE TABLE sales_metrics (
    metric_id INT PRIMARY KEY,
    january_value VARCHAR(35),
    february_value VARCHAR(35),
    march_value VARCHAR(35)
);

-- Insert sample data
INSERT INTO sales_metrics (metric_id, january_value, february_value, march_value) VALUES
(1, 'sales-jan-1', 'sales-feb-1', 'sales-march-1'),
(2, 'sales-jan-2', 'sales-feb-2', 'sales-march-2');
Code d’entrée :
SELECT
    m.metric_id,
    monthly_data.metric_value,
    monthly_data.month_number
FROM
    sales_metrics m
CROSS APPLY (
    SELECT m.january_value AS metric_value, '01' AS month_number
    UNION ALL
    SELECT m.february_value AS metric_value, '02' AS month_number
    UNION ALL
    SELECT m.march_value AS metric_value, '03' AS month_number
) AS monthly_data;
Code généré :
SELECT
    m.metric_id,
    monthly_data.metric_value,
    monthly_data.month_number
FROM
    sales_metrics m
    !!!RESOLVE EWI!!! /*** SSC-EWI-TS0082 - CROSS APPLY HAS BEEN CONVERTED TO LEFT OUTER JOIN AND REQUIRES MANUAL VALIDATION. ***/!!!
    LEFT OUTER JOIN
        (
               SELECT
                m.january_value AS metric_value, '01' AS month_number
               UNION ALL
               SELECT
                m.february_value AS metric_value, '02' AS month_number
               UNION ALL
               SELECT
                m.march_value AS metric_value, '03' AS month_number
           ) AS monthly_data;

Meilleures pratiques

Scénarios clés où une JOIN LEFT OUTER peut échouer

  • Comportement de filtrage : si la CROSS APPLY d’origine était destinée à filtrer les lignes de la table principale qui ne correspondent pas à la sous-requête, une JOIN LEFT OUTER ne répliquera pas ce comportement. Au lieu de cela, elle inclura ces lignes avec des valeurs NULL pour les colonnes jointes, ce qui peut ne pas correspondre au résultat prévu.

  • Sous-requêtes corrélées : CROSS APPLY est spécifiquement conçue pour prendre en charge les sous-requêtes corrélées, où la sous-requête fait référence à des colonnes de la requête externe. Une JOIN LEFT OUTER standard ne prend pas en charge ce schéma de la même manière. Tenter de convertir une sous-requête corrélée CROSS APPLY en une JOIN LEFT OUTER peut conduire à des erreurs de syntaxe, des produits cartésiens (lignes dupliquées) ou des résultats logiquement incorrects.

  • Différences de jeux de résultats : les sémantiques de CROSS APPLY et d’une JOIN LEFT OUTER diffèrent, en particulier lorsque la sous-requête ne renvoie aucune ligne. CROSS APPLY exclura ces lignes du résultat, tandis qu‘une JOIN LEFT OUTER les inclura avec des valeurs NULL.

Recommandation : examinez et testez toujours la sortie des requêtes où CROSS APPLY a été convertie en JOIN LEFT OUTER pour en assurer l’exactitude.

SSC-EWI-TS0083

Error Message

ROLLBACK TRANSACTION requires the appropriate setup to work as intended.

Gravité

Low

Description

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

Exemple de code

Input (SQL Server):

BEGIN TRANSACTION MyTransaction;

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

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

Output (Snowflake Scripting):

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

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

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

SSC-EWI-TS0085

INSERT WITH EXECUTE statement requires manual review.

Gravité

Medium

Description

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

Exemple de code

Code d’entrée :
INSERT INTO SalesReport
EXEC GenerateQuarterlySales @Quarter = 1;
Code généré :
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0085 - INSERT WITH EXECUTE NODE NEEDS TO BE CHECKED. ***/!!!
INSERT INTO SalesReport EXEC GenerateQuarterlySales @Quarter = 1;

Meilleures pratiques

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

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

  • Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.

SSC-EWI-TS0086

OPENQUERY is not supported in Snowflake.

Gravité

Élevé

Description

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

Exemple de code

Code d’entrée :
SELECT *
FROM OPENQUERY(OracleFinance, 'SELECT account_id, balance FROM accounts WHERE status = ''ACTIVE''');
Code généré :
SELECT
    *
FROM
    !!!RESOLVE EWI!!! /*** SSC-EWI-TS0086 - OPENQUERY NODE NEEDS TO BE CHECKED. ***/!!! OPENQUERY (OracleFinance, 'SELECT account_id, balance FROM accounts WHERE status = ''ACTIVE''');

Meilleures pratiques

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

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

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

  • Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.

SSC-EWI-TS0087

GOTO is not supported in Snowflake.

Gravité

Élevé

Description

This issue is generated when SnowConvert AI encounters a GOTO statement that cannot be automatically transformed.

When GOTO/Label patterns appear inside a stored procedure with only forward jumps to top-level labels, SnowConvert AI automatically transforms them into nested procedure definitions with CALL/RETURN semantics — no EWI is emitted in those cases. See the LABEL and GOTO translation reference for details on the transformation.

This EWI is only emitted when the GOTO cannot be transformed. This happens with backward GOTOs (where the target label appears before the GOTO in the source, which would require recursive calls), or when the GOTO appears inside anonymous blocks or UDFs (which do not support nested procedure definitions in Snowflake).

Exemple de code

The following example shows a backward GOTO used for retry logic. Because RetryConnection appears before the GOTO that jumps to it, the transformation cannot be applied and the EWI is emitted:

Code d’entrée :
CREATE PROCEDURE dbo.RetryDatabaseConnection
AS
BEGIN
    DECLARE @Attempts INT = 0
RetryConnection:
    SET @Attempts = @Attempts + 1
    IF @Attempts < 3
        GOTO RetryConnection
    RETURN 0
END
Code généré :
CREATE OR REPLACE PROCEDURE dbo.RetryDatabaseConnection ()
RETURNS VARCHAR
LANGUAGE SQL
EXECUTE AS CALLER
AS
$$
  DECLARE
    ATTEMPTS INT := 0;
  BEGIN
    !!!RESOLVE EWI!!! /*** SSC-EWI-TS0045 - LABELED STATEMENT IS NOT SUPPORTED IN SNOWFLAKE SCRIPTING ***/!!!
    RetryConnection:
    ATTEMPTS := :ATTEMPTS + 1;
    IF (:ATTEMPTS < 3) THEN
      !!!RESOLVE EWI!!! /*** SSC-EWI-TS0087 - GOTO IS NOT SUPPORTED IN SNOWFLAKE. ***/!!!
      GOTO RetryConnection
    END IF;
    RETURN 0;
  END;
$$;

Meilleures pratiques

  • For backward GOTO patterns like retry logic, refactor the control flow to use WHILE or LOOP constructs instead.

  • For GOTO in anonymous blocks or UDFs, restructure the code into separate procedures or use IF/ELSE control flow.

  • Forward GOTO patterns inside stored procedures are automatically transformed — no manual action is required for those cases.

  • Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.

Related EWIs

  • SSC-EWI-TS0045: Labeled statement is not supported in Snowflake Scripting.

  • SSC-EWI-TS0103: GOTO targeting a label inside a nested block is not supported in Snowflake.

SSC-EWI-TS0088

Unsupported sequence options were removed during conversion.

Gravité

Faible

Description

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

Exemple de code

Code d’entrée :
CREATE SEQUENCE InvoiceNumberSeq
START WITH 1000
INCREMENT BY 5
MINVALUE 100
MAXVALUE 50000
CYCLE;
Code généré :
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0088 - SEQUENCE OPTIONS 'MIN VALUE, MAX VALUE, CYCLE' WERE REMOVED, THEY ARE NOT SUPPORTED IN SNOWFLAKE ***/!!!
CREATE SEQUENCE InvoiceNumberSeq
  START WITH 1000
  INCREMENT BY 5
;

Meilleures pratiques

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

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

  • Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.

SSC-EWI-TS0089

SET statement is not supported in Snowflake.

Gravité

Faible

Description

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

Exemple de code

Code d’entrée :
SET CONCAT_NULL_YIELDS_NULL OFF;
Code généré :
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0089 - SET CONCAT_NULL_YIELDS_NULL OFF IS NOT SUPPORTED IN SNOWFLAKE. ***/!!!
SET CONCAT_NULL_YIELDS_NULL OFF;

Meilleures pratiques

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

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

  • Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.

Related EWIs

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

SSC-EWI-TS0090

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

Gravité

Medium

Description

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

Exemple de code

Code d’entrée :
EXEC msdb.dbo.sp_add_jobstep
    @job_name = N'NightlyArchive',
    @step_name = N'ArchiveOldRecords',
    @step_id = 1,
    @subsystem = N'CmdExec',
    @command = N'powershell.exe -File "C:\Scripts\archive_records.ps1"';
Code généré :
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0090 - AGENT JOB STEP 'ArchiveOldRecords' USES UNSUPPORTED SUBSYSTEM 'CmdExec'. MANUAL MIGRATION REQUIRED. ***/!!!
EXEC msdb.dbo.sp_add_jobstep @job_name = N'NightlyArchive', @step_name = N'ArchiveOldRecords', @step_id = 1, @subsystem = N'CmdExec', @command = N'powershell.exe -File "C:\Scripts\archive_records.ps1"';

Meilleures pratiques

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

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

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

  • Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.

SSC-EWI-TS0091

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

Gravité

Medium

Description

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

Exemple de code

Code d’entrée :
EXEC msdb.dbo.sp_send_dbmail
    @profile_name = N'DBA_Alerts',
    @recipients = N'admin@example.com',
    @subject = N'ETL job completed';
Code généré :
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0091 - AGENT JOB NOTIFICATION PROCEDURE 'sp_send_dbmail' REQUIRES MANUAL SETUP OF A SNOWFLAKE NOTIFICATION INTEGRATION. ***/!!!
EXEC msdb.dbo.sp_send_dbmail @profile_name = N'DBA_Alerts', @recipients = N'admin@example.com', @subject = N'ETL job completed';

Meilleures pratiques

  • Set up a Snowflake Notification Integration with an email provider or cloud messaging service (AWS SNS, Azure Event Grid, GCP Pub/Sub).

  • Use SYSTEM$SEND_EMAIL() in Snowflake to send email notifications from stored procedures and tasks.

  • Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.

SSC-EWI-TS0092

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

Gravité

Medium

Description

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

Exemple de code

Code d’entrée :
DECLARE @jobName NVARCHAR(128);
SET @jobName = N'ETL_Daily_Load';
EXEC msdb.dbo.sp_start_job @job_name = @jobName;
Code généré :
DECLARE
  JOBNAME NVARCHAR(128);
BEGIN
  JOBNAME := 'ETL_Daily_Load';
  !!!RESOLVE EWI!!! /*** SSC-EWI-TS0092 - AGENT JOB PROCEDURE 'sp_start_job' REFERENCES A DYNAMIC JOB NAME THAT CANNOT BE RESOLVED STATICALLY. ***/!!!
  EXEC msdb.dbo.sp_start_job @job_name = @jobName;
END;

Meilleures pratiques

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

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

  • Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.

SSC-EWI-TS0093

Agent Job procedure is not supported.

Gravité

Faible

Description

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

Exemple de code

Code d’entrée :
EXEC msdb.dbo.sp_update_jobstep
    @job_name = N'ETL_Nightly_Load',
    @step_id = 1,
    @step_name = N'UpdatedStepName';
Code généré :
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0093 - AGENT JOB PROCEDURE 'sp_update_jobstep' IS NOT SUPPORTED. ***/!!!
EXEC msdb.dbo.sp_update_jobstep @job_name = N'ETL_Nightly_Load', @step_id = 1, @step_name = N'UpdatedStepName';

Meilleures pratiques

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

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

  • Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.

SSC-EWI-TS0094

Error Message

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

Gravité

Medium

Description

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

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

Exemple de code

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

Meilleures pratiques

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

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

  • Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.

SSC-EWI-TS0095

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

Gravité

High

Note

Certaines parties du code de sortie sont omises pour des raisons de clarté.

Description

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

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

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

Exemple de code

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

Meilleures pratiques

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

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

  • Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.

SSC-EWI-TS0096

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

Gravité

High

Note

Certaines parties du code de sortie sont omises pour des raisons de clarté.

Description

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

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

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

  • The table name uses dynamic SQL or is otherwise unresolvable

  • The table definition is missing or incomplete

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

Exemple de code

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

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

Meilleures pratiques

  • Ensure all table definitions are included in the conversion input

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

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

  • Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.

SSC-EWI-TS0097

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

Gravité

High

Note

Certaines parties du code de sortie sont omises pour des raisons de clarté.

Description

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

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

Exemple de code

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

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

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

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

Meilleures pratiques

  • Verify that the table definition includes an IDENTITY column specification

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

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

  • Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.

SSC-EWI-TS0098

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

Gravité

Medium

Description

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

Exemple de code

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

Meilleures pratiques

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

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

  • Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.

SSC-EWI-TS0099

The OBJECT_SCHEMA_NAME function is not supported in Snowflake.

Note

This EWI is deprecated. OBJECT_SCHEMA_NAME is now converted to a helper UDF OBJECT_SCHEMA_NAME_UDF. When the two-argument form is used, refer to SSC-FDM-TS0060 for information about the removed database_id parameter.

Gravité

Low

Note

Certaines parties du code de sortie sont omises pour des raisons de clarté.

Description

This EWI was generated when SnowConvert AI encountered the SQL Server OBJECT_SCHEMA_NAME(object_id [, database_id]) function, which returns the schema name for a schema-scoped object given its numeric object ID. Snowflake does not use numeric object IDs for metadata lookups.

This EWI has been replaced by an automatic conversion to a helper UDF (OBJECT_SCHEMA_NAME_UDF) that queries INFORMATION_SCHEMA to resolve schema names.

Exemple de code

Input Code (SQL Server):
SELECT OBJECT_SCHEMA_NAME(1);
Generated Code (Snowflake SQL) — Previous behavior:
SELECT
OBJECT_SCHEMA_NAME(1) !!!RESOLVE EWI!!! /*** SSC-EWI-TS0099 - THE OBJECT_SCHEMA_NAME FUNCTION IS NOT SUPPORTED IN SNOWFLAKE ***/!!!;
Generated Code (Snowflake SQL) — Current behavior:
SELECT
PUBLIC.OBJECT_SCHEMA_NAME_UDF(1);

Meilleures pratiques

  • This EWI is no longer emitted. OBJECT_SCHEMA_NAME calls are now automatically converted to OBJECT_SCHEMA_NAME_UDF.

  • Review the generated UDF to ensure it resolves the correct schema for your objects.

  • Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.

SSC-EWI-TS0103

GOTO targeting a label inside a nested block is not supported in Snowflake.

Gravité

Élevé

Description

This EWI is generated when a GOTO targets a label that is declared inside a nested control flow block (such as IF, WHILE, BEGIN...END, or TRY...CATCH). SnowConvert AI’s GOTO/Label decomposition can only transform labels that are declared at the top level of a procedure body — labels buried inside nested blocks cannot be extracted into standalone nested procedures. When this happens, the GOTO is preserved with this EWI marker, while top-level labels in the same procedure are still transformed normally.

Exemple de code

In this example, Done is a top-level label and is transformed into a nested procedure. However, HandlePartialFailure is declared inside a BEGIN...END block, so the GOTO targeting it cannot be transformed:

Code d’entrée :
CREATE PROCEDURE dbo.ImportCustomerData
AS
BEGIN
    DECLARE @BatchId INT = 0, @IsValid INT = 0, @RowCount INT = 0
    IF @BatchId = 1 GOTO Done
    BEGIN
        IF @IsValid = 1 GOTO HandlePartialFailure
        SET @RowCount = 1
    HandlePartialFailure:
        SET @RowCount = 2
    END
Done:
    RETURN 0
END
Code généré :
CREATE OR REPLACE PROCEDURE dbo.ImportCustomerData ()
RETURNS VARCHAR
LANGUAGE SQL
EXECUTE AS CALLER
AS
$$
  DECLARE
    SC_EXIT_CODE VARCHAR;
    BATCHID INT := 0;
    ISVALID INT := 0;
    ROWCOUNT INT := 0;
    SC_PROCESS PROCEDURE ()
    RETURNS VARCHAR
    AS
      BEGIN
        IF (:BATCHID = 1) THEN
          BEGIN
            CALL Done();
            RETURN 'PROCESS FINISHED';
          END;
        END IF;
        BEGIN
          IF (:ISVALID = 1) THEN
            !!!RESOLVE EWI!!! /*** SSC-EWI-TS0103 - GOTO TARGETING A LABEL INSIDE A NESTED BLOCK IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
            GOTO HandlePartialFailure
          END IF;
          ROWCOUNT := 1;
          HandlePartialFailure:
          ROWCOUNT := 2;
        END;
        CALL Done();
      END;
    Done PROCEDURE ()
    RETURNS VARCHAR
    AS
      BEGIN
        SC_EXIT_CODE := 0;
      END;
  BEGIN
    CALL SC_PROCESS();
    RETURN :SC_EXIT_CODE;
  END;
$$;

Meilleures pratiques

  • Move the nested label to the top level of the procedure body so SnowConvert AI can transform it automatically.

  • Alternatively, replace the GOTO with structured IF/ELSE or LOOP control flow to avoid the jump entirely.

  • Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.

Related EWIs

SSC-EWI-TS0104

System table query pattern could not be automatically converted.

Gravité

Medium

Description

This EWI is generated when SnowConvert AI encounters a query pattern inside a system table query (such as sysconstraints) that it cannot translate automatically. Common triggers include:

  • OBJECT_NAME() called with an argument that doesn’t map to a known column (for example, OBJECT_NAME(status) instead of OBJECT_NAME(constid) or OBJECT_NAME(id))

  • OBJECT_NAME() compared against a non-literal value (a column reference, variable, or expression instead of a string literal)

In these cases the original expression is preserved and the EWI is emitted so you can review and rewrite the query manually.

Exemple de code

Input Code (SQL Server):
SELECT 1 FROM sysconstraints WHERE OBJECT_NAME(status) = 'X';
Generated Code (Snowflake SQL):
SELECT
    1
FROM
    INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE
    !!!RESOLVE EWI!!! /*** SSC-EWI-TS0104 - 'OBJECT_NAME(status) in sysconstraints query' COULD NOT BE AUTOMATICALLY CONVERTED IN SYSTEM TABLE QUERY. MANUAL REVIEW REQUIRED ***/!!!
    OBJECT_NAME(status) = 'X';
Input Code (SQL Server) - Non-literal comparison:
SELECT 1 FROM sysconstraints WHERE OBJECT_NAME(constid) = col1;
Generated Code (Snowflake SQL):
SELECT
    1
FROM
    INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE
    !!!RESOLVE EWI!!! /*** SSC-EWI-TS0104 - 'Non-literal comparison with OBJECT_NAME in sysconstraints query' COULD NOT BE AUTOMATICALLY CONVERTED IN SYSTEM TABLE QUERY. MANUAL REVIEW REQUIRED ***/!!!
    OBJECT_NAME(constid) = col1;

Meilleures pratiques

  • Replace OBJECT_NAME(constid) with CONSTRAINT_NAME and OBJECT_NAME(id) with TABLE_NAME when querying INFORMATION_SCHEMA.TABLE_CONSTRAINTS.

  • Ensure that the comparison value is a string literal. If you need to compare against a variable or column, rewrite the query to use the equivalent INFORMATION_SCHEMA column directly.

  • Review the sysconstraints translation reference for supported transformation patterns.

  • Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.

SSC-EWI-TS0107

CREATE TYPE AS TABLE cannot be converted to Snowflake

Gravité

Medium

Description

SQL Server table types created with CREATE TYPE ... AS TABLE (...) are not mapped to a single Snowflake CREATE TYPE equivalent. SnowConvert flags this pattern so you can redesign using tables, views, or other Snowflake constructs.

Exemple de code

Input Code (SQL Server):
CREATE TYPE dbo.OrderLines AS TABLE (
    order_id INT,
    line_no  INT,
    qty      DECIMAL(10, 2)
);
Generated Code (Snowflake SQL):
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0107 - CREATE TYPE AS TABLE IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
CREATE TYPE dbo.OrderLines AS TABLE (
    order_id INT,
    line_no INT,
    qty DECIMAL(10, 2)
);

Meilleures pratiques

  • Model reusable row shapes as permanent or transient tables, or use OBJECT/VARIANT patterns where appropriate.

  • Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.