SnowConvert : problèmes SQLServer

SSC-EWI-TS0060

Gravité

Medium

Description

Cet avertissement apparaît lorsqu’un composant temporel non pris en charge est utilisé comme paramètre dans une fonction liée à la date dans Snowflake. Pour obtenir la liste complète des composants de date et d’heure pris en charge, veuillez vous référer à la documentation Fonctions de date et d’heure | Snowflake.

Exemple de code

Code d’entrée

SELECT
    -- Supported
    DATEPART(second, getdate()),
    -- Not supported
    DATEPART(millisecond, getdate()),
    DATEPART(microsecond, getdate());
Copy

Code de sortie :

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

Recommandations

  • Vous pouvez créer une fonction définie par l’utilisateur (UDF) pour extraire manuellement les composantes temporelles qui ne sont pas directement prises en charge par Snowflake.

  • Pour toute assistance supplémentaire, veuillez nous contacter à l’adresse suivante : snowconvert-support@snowflake.com

SSC-EWI-TS0070

La fonction EWI a été supprimée. Pour des informations plus récentes, veuillez consulter la documentation SSC-FDM-TS0024.

Description

Cet avertissement apparaît lorsque vous utilisez CURRENT_TIMESTAMP avec la clause AT TIME ZONE. L’avertissement indique que les résultats peuvent être incohérents d’un scénario à l’autre en raison de la nature dynamique de CURRENT_TIMESTAMP.

La différence clé entre Microsoft SQL Server et la fonction CURRENT_TIMESTAMP de Snowflake est la gestion des fuseaux horaires :

  • SQL Server : renvoie la date et l’heure du système en fonction du fuseau horaire local du serveur

  • Snowflake : renvoie la date et l’heure en UTC (Coordinated Universal Time)

SELECT current_timestamp at time zone 'Hawaiian Standard Time';
Copy

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

SELECT
CONVERT_TIMEZONE('Pacific/Honolulu', CURRENT_TIMESTAMP() !!!RESOLVE EWI!!! /*** SSC-EWI-TS0070 - CURRENT_TIMESTAMP in At Time Zone statement may have a different behavior in certain cases ***/!!!);
Copy

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

Recommandations

Voici un exemple de la manière de maintenir un formatage cohérent dans Snowflake.

SELECT current_timestamp at time zone 'Hawaiian Standard Time';
Copy

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

Dans Snowflake, vous pouvez modifier le fuseau horaire par défaut en utilisant la commande ALTER SESSION. Par exemple :

ALTER SESSION SET TIMEZONE = 'Pacific/Honolulu';

SELECT
CONVERT_TIMEZONE('Pacific/Honolulu', 'UTC', CURRENT_TIMESTAMP());
Copy

2024-02-08 16:33:49.143

SSC-EWI-TS0044

Gravité

Critique

Certaines parties du code ont été omises pour que l’exemple reste clair et concis.

Description

Cet avertissement apparaît lors de l’utilisation de la clause FOR XML qui n’est pas disponible dans Snowflake SQL.

Exemple de code

Code d’entrée :

SELECT TOP 1 LastName
FROM AdventureWorks2019.Person.Person
FOR XML AUTO;
Copy

Code de sortie :

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

Recommandations

Pensez à utiliser des fonctions définies par l’utilisateur (UDFs) pour répliquer la fonctionnalité de votre code source. Vous trouverez ci-dessous des exemples d’UDFs qui peuvent vous aider à recréer le comportement original :

SQL Server

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

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

GO

-- FOR XML
SELECT *
FROM TempTable
FOR XML AUTO

GO

-- FOR XML RAW
SELECT *
FROM TempTable
FOR XML RAW
Copy
-- 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"/>
Copy

Snowflake

CREATE OR REPLACE TABLE TEMPTABLE (
Ref INT,
Des VARCHAR(100),
Qty INT
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
;

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

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

-- FOR XML RAW
SELECT
*
FROM
TempTable
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0044 - FOR XML RAW CLAUSE IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
FOR XML RAW;
Copy
-- 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"  />
Copy

SSC-EWI-TS0035

Gravité

Medium

Certaines parties du code ont été supprimées pour rendre l’exemple plus clair et plus facile à comprendre.

Description

Actuellement, Snowflake ne prend pas en charge les variables Curseur qui sont déclarées mais non initialisées. En conséquence, un EWI a été ajouté et le code correspondant a été commenté.

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

Code de sortie :

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

Recommandations

SSC-EWI-TS0001

Gravité

Critique

Certaines parties du code de sortie ont été supprimées pour rendre l’exemple plus clair et plus facile à suivre.

Description

Cet indicateur d’avertissement d’erreur (EWI) apparaît lorsque SnowConvert rencontre une erreur critique qui l’empêche de générer le corps de la fonction pendant la traduction.

Exemple de code

SQL Server

CREATE FUNCTION func1 ()
RETURNS VARCHAR
SELECT
   *
FROM
   TABLE1
Copy

Snowflake

CREATE OR REPLACE FUNCTION func1 ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"transact"}}'
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0001 - THE BODY WAS NOT GENERATED FOR FUNCTION 'func1' ***/!!!
AS
$$

$$;
Copy

Recommandations

SSC-EWI-TS0025

Gravité

Faible

Générez des procédures et des macros dans JavaScript en ajoutant l’indicateur -t JavaScript ou --PLTargetLanguage JavaScript à votre commande.

Certaines parties du code de sortie ont été supprimées pour rendre l’exemple plus clair et plus facile à suivre.

Description

Cet EWI apparaît lors de la traduction de la fonction intégrée ERROR_SEVERITY. La fonction renvoie une valeur par défaut de 16, qui représente le niveau de gravité le plus courant dans SQL Server. La fonction définie par l’utilisateur (UDF) doit récupérer cette valeur.

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
Copy

Code de sortie :

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

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

Recommandations

SSC-EWI-TS0074

Gravité

Faible

Certaines parties du code ont été omises pour que l’exemple reste clair et concis.

Description

Cet avertissement apparaît lors de la conversion des fonctions TRY_CAST et TRY_CONVERT. Les résultats dans Snowflake peuvent être différents de l’original parce que certaines dépendances de type de données n’ont pas pu être résolues. Cela se produit généralement lorsque les dépendances requises ne sont pas présentes dans le code source.

Code d’entrée :

SELECT TRY_CONVERT( INT, col1) FROM TABLE1;

SELECT TRY_CAST(COL1 AS FLOAT) FROM TABLE1
Copy

Code de sortie

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

Recommandation

Si vous avez besoin d’une assistance technique, veuillez contacter notre équipe de support à l’adresse suivante : snowconvert-support@snowflake.com.

SSC-EWI-TS0034

Gravité

Élevé

Description

Cet avertissement apparaît lorsque SnowConvert ne peut pas déterminer automatiquement la structure des colonnes pour la clause RETURNS TABLE d’une fonction lors de la conversion du code. Par conséquent, la clause RETURNS TABLE est laissée vide dans le code généré. Cela se produit généralement lorsque les informations relatives à la colonne ne peuvent pas être déduites du code source original.

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();
Copy

Code de sortie :

CREATE OR REPLACE FUNCTION Sales.ufn_SalesByStore2 ()
RETURNS TABLE(
  DepartmentID STRING /*** SSC-FDM-TS0012 - INFORMATION FOR THE COLUMN DepartmentID WAS NOT FOUND. STRING DATATYPE USED TO MATCH CAST AS STRING OPERATION ***/,
  Name STRING /*** SSC-FDM-TS0012 - INFORMATION FOR THE COLUMN Name WAS NOT FOUND. STRING DATATYPE USED TO MATCH CAST AS STRING OPERATION ***/,
  GroupName STRING /*** SSC-FDM-TS0012 - INFORMATION FOR THE COLUMN GroupName WAS NOT FOUND. STRING DATATYPE USED TO MATCH CAST AS STRING OPERATION ***/
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
AS
$$
  --** SSC-PRF-TS0001 - PERFORMANCE WARNING - RECURSION FOR CTE NOT CHECKED. MIGHT REQUIRE RECURSIVE KEYWORD **
    WITH CTE AS (
    SELECT
      DepartmentID,
      Name,
      GroupName
    FROM
      HumanResources.Department
    )
    SELECT tab.* FROM
    CTE tab
$$;

SELECT
    *
FROM GetDepartmentInfo() !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'TableValuedFunctionCall' NODE ***/!!!;
Copy

Recommandations

  • Pour résoudre ce problème, assurez-vous que tous les objets requis sont accessibles à votre code. Si le problème persiste après avoir vérifié que tous les objets nécessaires sont disponibles, veuillez nous contacter en nous donnant des détails sur votre cas d’utilisation spécifique.

  • Pour obtenir un soutien supplémentaire, envoyez-nous un courriel à l’adresse suivante : snowconvert-support@snowflake.com

SSC-EWI-TS0041

Gravité

Medium

Description

Cet EWI s’applique aux méthodes des types de données suivants XML, qui ne sont actuellement pas disponibles dans Snowflake SQL :

  • Valeur : les données ou le contenu réels stockés dans une variable ou un champ

  • Requête : une requête pour récupérer des informations spécifiques dans une base de données

  • Exister : vérifier si un élément ou une condition particulière est présent(e)

  • Modifier : changer ou mettre à jour des données ou des paramètres existants

  • Nœuds : éléments individuels ou points de connexion au sein d’une structure de données

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

Code de sortie :

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

Recommandations

  • Utiliser des fonctions définies par l’utilisateur (UDFs) pour répliquer les fonctionnalités de votre code source original

  • Pour obtenir des conseils sur la gestion des types de données XML dans Snowflake, consultez la documentation suivante

  • Pour toute assitance supplémentaire, contactez notre équipe de support à l’adresse suivante : snowconvert-support@snowflake.com

SSC-EWI-TS0010

Certaines parties du code de sortie ont été supprimées pour rendre l’exemple plus clair et plus facile à suivre.

Gravité

Élevé

Description

Cette erreur se produit lorsqu’une expression de table commune (CTE) est utilisée de manière incorrecte dans une vue. Les vues sont des représentations en lecture seule des requêtes qui définissent la manière de récupérer et d’afficher les données, plutôt que de les modifier.

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

Code de sortie :

!!!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
));
Copy

Recommandations

SSC-EWI-TS0024

Gravité

Faible

Description

Cet avertissement apparaît lorsqu’une opération BULK INSERT au sein d’une procédure stockée ne peut pas être détectée. Par conséquent, les dépendances requises pour la transformation complète ne seront pas créées. En outre, la commande COPY INTO convertie tentera de récupérer des fichiers à partir d’une étape tempStage, qui doit être créée manuellement par l’utilisateur.

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
Copy

Code de sortie :

CREATE OR REPLACE FILE FORMAT FILE_FORMAT_638461207064166040
FIELD_DELIMITER = '\t'
RECORD_DELIMITER = '\n';

CREATE OR REPLACE STAGE STAGE_638461207064166040
FILE_FORMAT = FILE_FORMAT_638461207064166040;

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

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

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

Recommandations

SSC-EWI-TS0075

Gravité

Medium

Description

La traduction intégrée des procédures n’est pas disponible actuellement.

Exemple de code

Code d’entrée :

EXEC sp_column_privileges_rowset_rmt 'Caption';
Copy

Code de sortie :

!!!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';
Copy

Recommandations

  • Aucune action n’est requise de la part des utilisateurs.

  • Pour une assistance supplémentaire, veuillez nous contacter à l’adresse suivante : snowconvert-support@snowflake.com

SSC-EWI-TS0055

Cet EWI n’est plus utilisé. Veuillez consulter les informations mises à jour dans SSC-FDM-TS0020.

Gravité

Medium

Description

Cet avertissement apparaît lorsqu’une contrainte par défaut se trouve dans une instruction Alter Table.

Actuellement, ce type de contraintes n’est pas pris en charge. Il existe toutefois une solution de contournement : si la table est définie avant l’instruction Alter Table, il est possible d’identifier les références et de combiner la contrainte par défaut avec la définition de la table. Si cela n’est pas possible, la contrainte sera commentée dans le code converti.

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

Code de sortie :

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

Si toutes les instructions d’une commande de table de conversion ne sont pas valides, l’ensemble de la commande de table de conversion sera commenté dans le code converti.

Problèmes connus

Lorsque plusieurs contraintes par défaut sont définies pour la même colonne, seule la première contrainte sera incluse dans l’instruction de création de table.

Recommandations

SSC-EWI-TS0061

Gravité

Medium

Certaines parties du code ont été supprimées pour rendre l’exemple plus clair et plus facile à comprendre.

Description

Cet avertissement apparaît lorsqu’une instruction ALTER COLUMN non prise en charge est détectée.

Exemple de code

Code d’entrée :

ALTER TABLE SampleTable
ALTER COLUMN SampleColumn INT NULL SPARSE;
Copy

Code de sortie :

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

Recommandations

SSC-EWI-TS0045

Gravité

Faible

Certaines parties de la sortie du code ont été supprimées pour que l’exemple reste clair et concis.

Description

Ce message d’alerte (EWI) est généré pour tous les noms d’étiquettes qui sont référencés par les instructions GOTO dans SQL Server.

Exemple de code

Code d’entrée :

CREATE PROCEDURE GoToProcedure
AS
BEGIN
DECLARE @TotalMaarks INT
SET @TotalMaarks = 49
IF @TotalMaarks >= 50
    GOTO Pass
IF @TotalMaarks < 50
    GOTO Fail
Pass:
    SELECT 1;
    SELECT * FROM TABLE1;
    RETURN 1;
Fail:
    SELECT 2;
    SELECT * FROM TABLE2;
    RETURN 2;
END
Copy

Code de sortie :

CREATE OR REPLACE PROCEDURE GoToProcedure ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
EXECUTE AS CALLER
AS
$$
    DECLARE
        TOTALMAARKS INT;
    BEGIN

        TOTALMAARKS := 49;
        IF (:TOTALMAARKS >= 50) THEN
            !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'GOTO' NODE ***/!!!
            GOTO Pass
        END IF;
        IF (:TOTALMAARKS < 50) THEN
            !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'GOTO' NODE ***/!!!
            GOTO Fail
        END IF;
        !!!RESOLVE EWI!!! /*** SSC-EWI-TS0045 - LABELED STATEMENT IS NOT SUPPORTED IN SNOWFLAKE SCRIPTING ***/!!!
        Pass:
        SELECT 1;
    SELECT
            *
        FROM
            TABLE1;
        RETURN 1;

        !!!RESOLVE EWI!!! /*** SSC-EWI-TS0045 - LABELED STATEMENT IS NOT SUPPORTED IN SNOWFLAKE SCRIPTING ***/!!!
        Fail:
        SELECT 2;
    SELECT
            *
        FROM
            TABLE2;
        RETURN 2;

    END;
$$;
Copy

Recommandations

connexesEWI

  1. SSC-EWI-0073 : ce code nécessite une révision pour assurer l’équivalence fonctionnelle.

SSC-EWI-TS0009

Certaines parties du code de sortie ont été supprimées pour rendre l’exemple plus clair et plus facile à suivre.

Gravité

Élevé

Description

Cette erreur indique la présence de transactions imbriquées, qui se produisent lorsqu’une nouvelle transaction est lancée à l’intérieur d’une transaction existante dans SQL Server. Lorsqu’une instruction BEGIN supplémentaire est exécutée après la première, une nouvelle transaction est créée et le compteur de transactions augmente d’une unité.

Snowflake ne prend pas en charge les transactions imbriquées. Si vous utilisez une deuxième instruction BEGIN, elle sera ignorée et une seule transaction sera maintenue. Pour plus de détails sur le comportement des transactions de SQL Server, veuillez consulter les 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;
Copy

Code de sortie :

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

!!!RESOLVE EWI!!! /*** SSC-EWI-0040 - THE STATEMENT IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
;
Copy

Recommandations

  • Snowflake ignorera les transactions imbriquées au lieu de générer des erreurs de compilation. Vous pouvez consulter les rapports d’évaluation pour identifier les éventuelles transactions imbriquées dans votre code.

  • Pour une assistance supplémentaire, veuillez nous contacter à l’adresse suivante : snowconvert-support@snowflake.com

connexesEWI

  1. SSC-FDM-0020 : les résultats de plusieurs requêtes sont stockés dans des tables temporaires

  2. SSC-EWI-0001 : jeton inconnu ou non valide trouvé dans la ligne de code source

  3. SSC-EWI-0040 : l’instruction n’est pas prise en charge

SSC-EWI-TS0039

Gravité

Medium

Description

Cet avertissement apparaît lorsque plusieurs instructions SET sont trouvées pour le même curseur. Dans Snowflake Scripting, vous ne pouvez avoir qu’une seule instruction SET par curseur. Toute instruction SET supplémentaire pour le même curseur sera automatiquement commentée lors de la conversion.

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

Code de sortie :

CREATE OR REPLACE PROCEDURE multipleSetExample ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
EXECUTE AS CALLER
AS
$$
	DECLARE
		MYCURSOR CURSOR
		FOR
			SELECT col3
			FROM defaultTable;
		MYCURSOR2 CURSOR
		FOR
			SELECT
				FirstName
			FROM
				vEmployee;
		MYCURSOR3 CURSOR
		FOR
			SELECT *
			FROM someTable;
	BEGIN





		!!!RESOLVE EWI!!! /*** SSC-EWI-0040 - THE STATEMENT IS NOT SUPPORTED IN SNOWFLAKE ***/!!!!!!RESOLVE EWI!!! /*** SSC-EWI-TS0039 - CURSOR VARIABLE MYCURSOR SET MULTIPLE TIMES, THIS IS NOT VALID IN SNOWFLAKE SCRIPTING ***/!!!

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

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

Recommandations

SSC-EWI-TS0078

Gravité

Medium

Description

Cette erreur se produit lorsque des expressions telles que des appels de fonctions, des noms de variables ou des constantes nommées sont placées après la casse par défaut dans une instruction de commutation.

Snowflake n’accepte en entrée que des valeurs constantes explicites, telles que des nombres ou des chaînes.

Exemple de code

Code d’entrée :

ALTER TABLE
    T_ALTERTABLETEST
ADD
    COLUMN COL10 INTEGER DEFAULT RANDOM(10);
Copy

Code de sortie :

--** 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);
Copy

Recommandations

SSC-EWI-TS0079

Gravité

Medium

Description

Cet avertissement apparaît lorsque SnowConvert détecte une instruction DBCC (Database Console Command) dans votre code source. Les instructions DBCC sont des commandes de maintenance de la base de données qui ne sont généralement pas compatibles avec l’architecture de Snowflake.

Exemple de code

Code d’entrée :

DBCC CHECKIDENT(@a, RESEED, @b) WITH NO_INFOMSGS
Copy

Code de sortie :

!!!RESOLVE EWI!!! /*** SSC-EWI-TS0079 - DATABASE CONSOLE COMMAND 'CHECKIDENT' IS NOT SUPPORTED. ***/!!!
DBCC CHECKIDENT(@a, RESEED, @b) WITH NO_INFOMSGS;
Copy

Recommandations

  • Il s’agit d’un message d’information qui n’exige aucune action de votre part.

  • Pour toute assistance supplémentaire, veuillez nous contacter à l’adresse suivante : snowconvert-support@snowflake.com

SSC-EWI-TS0049

Certaines parties du code ont été supprimées pour en faciliter la compréhension.

Gravité

Medium

Description

La plupart des instructions IF qui contiennent un bloc Begin ... End sont prises en charge et s’exécuteront avec succès sans générer l’erreur SSC-EWI-TS0049.

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
Copy

Code de sortie :

--** SSC-FDM-0029 - USER DEFINED FUNCTION WAS TRANSFORMED TO SNOWFLAKE PROCEDURE **
CREATE OR REPLACE PROCEDURE PURCHASING.FOO (STATUS INT)
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
EXECUTE AS CALLER
AS
$$
    DECLARE
        RESULT INT := 10;
    BEGIN

        SELECT
            quantity
        INTO
            :RESULT
        FROM
            TABLE1
        WHERE
            COL1 = :STATUS;
        IF (:RESULT = 3) THEN
            BEGIN
                IF (:RESULT >0) THEN SELECT
                        0
                    INTO
                        :RESULT;
                ELSE
                    SELECT
                        1
                    INTO
                        :RESULT;
                END IF;
        SELECT
                    1
                INTO
                    :RESULT;
            END;
        END IF;
        RETURN :RESULT;
    END;
$$;
Copy

Lorsque vous utilisez un exemple de code de base (comme celui présenté ci-dessus), la conversion fonctionne correctement. Cependant, dans certains cas extrêmes, l’instruction « IF » n’est pas convertie correctement, ce qui entraîne la génération d’un message EWI (Erreur, Avertissement ou Information).

Support manuel

Cas 1 : instruction unique

Dans ces scénarios, la transformation est simple car l’instruction convertie fera partie d’une clause SELECT.

IF @result = 0
BEGIN
    SET @result =1
END
Copy
CASE WHEN (SELECT RESULT FROM CTE2)= 0 THEN
( SELECT 1 AS RESULT )
Copy

Cas 2 : instructions multiples

Lorsque vous transformez plusieurs instructions SQL, convertissez-les de manière séquentielle. Commencez par la première instruction (N) et utilisez sa sortie comme table source pour l’instruction suivante (N+1).

IF @result = 0
BEGIN
    Statement1
    Statement2
    Statement3
END
Copy
CASE WHEN (SELECT RESULT FROM CTE2)= 0 THEN
(
    SELECT TransformedStatement3
    FROM (
        SELECT TransformedStatement2
        FROM (
            SELECT TransformedStatement1
        ) T1
    ) T2
)
Copy

Cas 3 : instructions d’ensembles multiples

Dans ces situations, vous devrez créer une transformation distincte pour chaque instruction SET.

IF @result = 0
BEGIN
    SET @var1 = 1
    SET @var2 = 3
    SET @var3 = @var2
END
Copy
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)
...
Copy

Recommandations

SSC-EWI-TS0037

Gravité

Medium

Certaines parties du code ont été supprimées pour rendre l’exemple plus clair et plus facile à suivre.

Description

Dans Snowflake Scripting, les curseurs ne peuvent que se déplacer vers l’avant dans le jeu de résultats (non défilable). Vous ne pouvez utiliser FETCH NEXT que pour récupérer des enregistrements un par un.

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

Code de sortie :

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

Recommandations

SSC-EWI-TS0013

Cet avertissement n’est plus valable. Veuillez consulter SSC-FDM-TS0013 pour la documentation actuelle.

Gravité

Faible

Description

Cet avertissement apparaît lors de la conversion d’une colonne calculée de SQL Server vers Snowflake. Il vous alerte sur le fait que la fonctionnalité pourrait ne pas être exactement la même après la conversion.

Exemple de code

Code d’entrée :

CREATE TABLE [TestTable](
    [Col1] AS (CONVERT ([REAL], ExpressionValue))
);
Copy

Code de sortie :

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

Recommandations

  • Ce message est destiné à votre information. Aucune action n’est nécessaire.

  • Veuillez ajouter toute modification manuelle aux expressions qui n’ont pas été transformées automatiquement.

  • Pour toute assistance supplémentaire, veuillez nous contacter à l’adresse suivante : snowconvert-support@snowflake.com

SSC-EWI-TS0076

Ce message d’avertissement n’est plus utilisé. Veuillez consulter SSC-EWI-0002 pour la documentation actuelle.

Gravité

Medium

Description

Les paramètres par défaut doivent être placés à la fin de la liste des paramètres dans les procédures stockées et les fonctions de Snowflake. Tout paramètre comportant des valeurs par défaut doit être placé à la fin de la séquence de déclaration des 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;
Copy

Code de sortie :

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

Recommandations

  • Aucune action n’est requise de la part des utilisateurs finaux.

  • Pour une assistance supplémentaire, veuillez nous contacter à l’adresse suivante : snowconvert-support@snowflake.com

SSC-EWI-TS0056

Cet avertissement n’est plus valable. Veuillez consulter SSC-FDM-TS0021 pour la documentation actuelle.

Gravité

Faible

Certaines parties du code ont été supprimées pour rendre l’exemple plus clair et plus facile à comprendre.

Description

Cet EWI apparaît lorsqu’une instruction Alter Table contient une clause MASKED WITH. Il indique que le système a créé une MASKING POLICY approximative pour remplacer la fonction MASKED WITH.

Exemple de code

Code d’entrée :

ALTER TABLE table_name
ALTER COLUMN column_name
ADD MASKED WITH (FUNCTION = 'default()');
Copy

Code de sortie :

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

Une MASKING POLICY doit être créée avant l’exécution de l’instruction ALTER TABLE. Veuillez noter que le comportement de la politique peut être approximatif et nécessiter des ajustements au niveau des rôles et des autorisations des utilisateurs.

Recommandations

SSC-EWI-TS0023

Gravité

Faible

Certaines parties de la sortie du code ont été supprimées pour que l’exemple reste clair et concis.

Description

Cet avertissement apparaît lorsqu’une option BULK INSERT ne peut pas être convertie. Les options correspondantes doivent être spécifiées en tant qu’options FILE FORMAT dans Snowflake.

Exemple de code

Code d’entrée :

BULK INSERT #PCE FROM 'E:\PCE_Look-up_table.txt'
WITH
(
   FIELDTERMINATOR ='\t',
   ROWTERMINATOR ='\n',
   FIRE_TRIGGERS
);
Copy

Code de sortie :

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

Recommandations

connexesEWI

  1. SSC-FDM-TS0004 : l’instruction PUT ne peut pas être exécutée via l’interface utilisateur.

SSC-EWI-TS0072

Gravité

Faible

Certaines parties du code de sortie ont été supprimées pour rendre l’exemple plus clair et plus facile à suivre.

Description

Cet avertissement apparaît lorsque des instructions SELECT et des paramètres OUTPUT doivent être renvoyés. Dans ce cas, les résultats des instructions SELECT priment sur les paramètres OUTPUT.

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
Copy

Code de sortie :

CREATE OR REPLACE PROCEDURE SOMEPROC (PRODUCT_COUNT INT, _123 INT)
RETURNS ARRAY
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
EXECUTE AS CALLER
AS
$$
	DECLARE
		ProcedureResultSet1 VARCHAR;
		ProcedureResultSet2 VARCHAR;
		return_arr ARRAY := array_construct();
	BEGIN
		ProcedureResultSet1 := 'RESULTSET_' || REPLACE(UPPER(UUID_STRING()), '-', '_');
		CREATE OR REPLACE TEMPORARY TABLE IDENTIFIER(:ProcedureResultSet1) AS
			SELECT
				*
			from
				AdventureWorks.HumanResources.Department;
		return_arr := array_append(return_arr, :ProcedureResultSet1);
		ProcedureResultSet2 := 'RESULTSET_' || REPLACE(UPPER(UUID_STRING()), '-', '_');
		CREATE OR REPLACE TEMPORARY TABLE IDENTIFIER(:ProcedureResultSet2) AS
			SELECT
				*
			from
				AdventureWorks.HumanResources.Employee;
		return_arr := array_append(return_arr, :ProcedureResultSet2);
		--** SSC-FDM-0020 - MULTIPLE RESULT SETS ARE RETURNED IN TEMPORARY TABLES **
		RETURN return_arr;
		!!!RESOLVE EWI!!! /*** SSC-EWI-TS0072 - RETURN statement will be ignored due to previous RETURN statement ***/!!!
		RETURN OBJECT_CONSTRUCT('PRODUCT_COUNT', :PRODUCT_COUNT, '_123', :_123);
	END;
$$;
Copy

Recommandations

  • Supprimez les instructions RETURN qui doivent être ignorées.

  • Pour toute assistance supplémentaire, veuillez nous contacter à l’adresse suivante : snowconvert-support@snowflake.com

connexesEWI

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

SSC-EWI-TS0046

Gravité

Medium

Description

Cet avertissement apparaît lorsque le code fait référence à des tables du système de SQL Server qui n’ont pas d’équivalent Snowflake SQL ou qui ne sont pas prises en charge par Snowflake.

Exemple de code

Code d’entrée :

SELECT *
FROM
    sys.all_sql_modules
WHERE
    [STATE] = 0; -- state must be ONLINE
Copy

Code de sortie :

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
Copy

Recommandations

SSC-EWI-TS0017

Gravité

Faible

Description

Cet avertissement apparaît lorsque SnowConvert détecte une colonne masquée dans une instruction CREATE TABLE. Dans Snowflake, le masquage des colonnes ne peut pas être mis en œuvre en ajoutant simplement une option dans la définition de la colonne. Pour obtenir la même fonctionnalité de masquage des données que SQL Server, vous devrez mettre en œuvre manuellement la logique de masquage.

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

Code de sortie :

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

Recommandations

SnowConvert ne prend actuellement pas en charge la génération automatique de MASKING POLICIES. Vous devrez créer ces politiques manuellement.

Tout d’abord, créez un rôle qui sera responsable de la gestion des politiques de masquage.

create role masking_admin;
Copy

Ensuite, accordez les privilèges requis au rôle nouvellement 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;
Copy

Créez les fonctions de la politique de masquage à l’étape suivante.

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

Pour démontrer les fonctions de masquage, nous montrerons des exemples de fonctions de masquage de SQL Server et leurs implémentations équivalentes dans Snowflake.

Appliquez la politique de masquage à la colonne pour laquelle le masquage était activé 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;
Copy

Si vous avez besoin d’une aide supplémentaire, veuillez contacter notre équipe de support à l’adresse suivante : snowconvert-support@snowflake.com

SSC-EWI-TS0057

Cet EWI a été supprimé. Veuillez vous référer à la documentation SSC-FDM-TS0022 pour obtenir des informations à jour.

Gravité

Faible

Certaines parties du code ont été supprimées pour rendre l’exemple plus clair et plus facile à comprendre.

Description

Cette erreur se produit lorsqu’une fonctionnalité MASKING POLICY nécessite l’attribution d’un rôle ou d’un privilège pour fonctionner correctement. Sans les autorisations nécessaires, le masquage des données ne fonctionnera pas.

Exemple de code

Code d’entrée

ALTER TABLE tableName
ALTER COLUMN columnName
ADD MASKED WITH (FUNCTION = 'partial(1, "xxxxx", 1)');
Copy

Code de sortie :

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

Comme le montre la ligne 6, vous pouvez ajouter une ou plusieurs valeurs de rôle dans le caractère générique, en les séparant par des virgules. N’oubliez pas que chaque valeur de rôle doit être placée entre guillemets doubles.

Recommandations

SSC-EWI-TS0063

Gravité

Critique

Description

Cet avertissement apparaît lorsque le code contient des fuseaux horaires qui ne sont pas pris en charge par Snowflake.

Exemple de code

Code d’entrée :

SELECT current_timestamp at time zone 'Turks And Caicos Standard Time';
Copy

Code de sortie :

SELECT
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0063 - TIME ZONE NOT SUPPORTED IN SNOWFLAKE ***/!!!
CURRENT_TIMESTAMP() at time zone 'Turks And Caicos Standard Time'
                                                                 ;
Copy

Recommandations

  • Vous pouvez créer une fonction définie par l’utilisateur pour gérer les différentes zones horaires.

  • Pour toute assistance supplémentaire, veuillez nous contacter à l’adresse suivante : snowconvert-support@snowflake.com

SSC-EWI-TS0032

L’interface Web externe (EWI) est générée exclusivement lors de la conversion des procédures stockées en JavaScript. Toutefois, cette fonction n’est plus recommandée, car Snowflake Scripting est désormais la langue préférée pour les procédures stockées.

Gravité

Élevé

Générez des procédures et des macros dans JavaScript en ajoutant l’indicateur -t JavaScript ou --PLTargetLanguage JavaScript à votre commande.

Certaines parties de la sortie du code ont été supprimées pour rendre l’exemple plus clair.

Description

Cet avertissement apparaît lors de la conversion d’un littéral concaténé contenant une instruction BULK INSERT. Le processus de conversion traduit BULK INSERT en une commande Snowflake PUT. Toutefois, cette commande PUT ne peut pas être exécutée lorsqu’elle émane de Dynamic SQL.

Pour traiter correctement les instructions BULK INSERT, vous devez exécuter la commande PUT séparément de la procédure. Si votre procédure contient plusieurs instructions BULK INSERT dans Dynamic SQL, il est recommandé de :

  1. Diviser la procédure en plusieurs parties

  2. Exécuter manuellement la commande PUT correspondant à chaque instruction BULK INSERT

Cette approche garantit un chargement des fichiers et une insertion des données corrects.

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

Code de sortie :

CREATE OR REPLACE PROCEDURE dbo.Load_FuelMgtMasterData ()
RETURNS STRING
LANGUAGE JAVASCRIPT
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
EXECUTE AS CALLER
AS
$$
    // SnowConvert Helpers Code section is omitted.

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

CREATE OR REPLACE STAGE STAGE_638461213351333410
FILE_FORMAT = FILE_FORMAT_638461213351333410;

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

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

Recommandations

  • Extrayez et exécutez la commande PUT générée par l’instruction BULK INSERT Dynamic avant d’exécuter la procédure.

  • Pour toute assistance supplémentaire, veuillez nous contacter à l’adresse suivante : snowconvert-support@snowflake.com

SSC-EWI-TS0073

Ce problème d’alerte précoce n’est plus pris en charge. Veuillez consulter SSC-FDM-TS0023 pour la documentation actuelle.

Gravité

Faible

Description

Cet avertissement apparaît lors de la transformation de la fonction ERROR_MESSAGE(). Veuillez noter que le message d’erreur exact peut être différent dans Snowflake.

Code d’entrée :

SET @varErrorMessage = ERROR_MESSAGE()
Copy

Code de sortie

BEGIN
VARERRORMESSAGE := SQLERRM !!!RESOLVE EWI!!! /*** SSC-EWI-TS0073 - ERROR MESSAGE COULD BE DIFFERENT IN SNOWFLAKE ***/!!!;
END;
Copy

Recommandation

Si vous avez besoin d’aide, veuillez contacter notre équipe de support à l’adresse suivante : snowconvert-support@snowflake.com.

SSC-EWI-TS0080

Gravité

Élevé

Description

La commande EXECUTE AS de SQL Server permet aux utilisateurs de changer temporairement de contexte d’exécution. Cette modification affecte à la fois leurs privilèges d’exécution et la sortie des fonctions contextuelles telles que USER_NAME(). Pour revenir au contexte d’origine, les utilisateurs peuvent utiliser la commande REVERT après avoir terminé leurs opérations.

Dans Snowflake, les procédures nécessitent un contexte d’exécution, qui ne peut être paramétré que lors de la création ou de la modification d’une procédure à l’aide des instructions CREATE PROCEDURE ou ALTER PROCEDURE. Vous ne pouvez pas modifier ce contexte pendant le déroulement de la procédure.

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
Copy

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

Recommandations

  • Modifiez le code pour qu’il fonctionne sans changement de contexte.

  • Pour toute assistance supplémentaire, contactez-nous à l’adresse suivante : snowconvert-support@snowflake.com

SSC-EWI-TS0047

Cet avertissement n’est plus valable. Veuillez consulter SSC-FDM-TS0019 pour la documentation actuelle.

Gravité

Faible

Description

Cet avertissement indique que le message d’erreur RAISERROR peut être différent en raison des règles de formatage des chaînes de 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
Copy

Code de sortie :

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

Recommandations

SSC-EWI-TS0016

Certaines parties du code ont été supprimées pour rendre l’exemple plus clair et plus facile à suivre.

Description

Cet avertissement apparaît lorsque SnowConvert détecte une fonction scalaire ODBC dans votre code source. Veuillez noter que les fonctions scalaires ODBC ne peuvent pas être converties en fonctions définies par l’utilisateur dans Snowflake.

Exemple de code

Code d’entrée :

SELECT {fn CURRENT_DATE_UDF()};
Copy

Code de sortie :

SELECT
!!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'CURRENT_DATE_UDF' NODE ***/!!!
CURRENT_DATE_UDF() !!!RESOLVE EWI!!! /*** SSC-EWI-TS0016 - USER DEFINED FUNCTIONS ARE NOT SUPPORTED IN ODBC SCALAR FUNCTION. ***/!!!;
Copy

connexesEWI

  1. SSC-EWI-0073 : un examen de l’équivalence fonctionnelle est exigé.

Recommandations

  • Ceci est uniquement pour votre information. Aucune action n’est nécessaire.

  • Pour toute assistance supplémentaire, veuillez nous contacter à l’adresse suivante : snowconvert-support@snowflake.com

SSC-EWI-TS0036

Gravité

Medium

Certaines parties du code ont été omises pour que l’exemple reste clair et concis.

Description

Cet avertissement apparaît lorsque le code contient des types de curseurs qui ne sont pas des curseurs locaux. Étant donné que Snowflake Scripting ne prend en charge actuellement que les curseurs locaux, tous les types de curseurs seront automatiquement convertis en curseurs locaux lors de la traduction.

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

Recommandations

SSC-EWI-TS0067

Gravité

Critique

Certaines parties de la sortie du code ont été supprimées pour que l’exemple reste clair et concis.

Description

Cet avertissement apparaît lorsque OPENXML contient des paramètres non valides, en particulier lorsque le chemin d’accès spécifié pour XML est inaccessible.

Pour résoudre cet EWI, vous devez fournir le chemin complet du nœud dans les paramètres.

Code d’entrée :

SELECT
    *
FROM
    OPENXML (@idoc, @path, 1) WITH (
        CustomerID VARCHAR(10),
        ContactName VARCHAR(20)
    );
Copy

Code de sortie :

SELECT
    *
FROM
    !!!RESOLVE EWI!!! /*** SSC-EWI-TS0067 - INVALID PARAMETERS IN OPENXML TABLE-VALUED FUNCTION ***/!!!
    OPENXML(@idoc, @path, 1);
Copy

Code d’entrée (paramètre explicite)

SELECT
    *
FROM
    OPENXML (@idoc, '/ROOT/Customer', 1) WITH(
        CustomerID VARCHAR(10),
        ContactName VARCHAR(20)
    );
Copy

Code de sortie (paramètre explicite)

SELECT
    Left(value:Customer['@CustomerID'], '10') AS 'CustomerID',
    Left(value:Customer['@ContactName'], '20') AS 'ContactName'
FROM
    OPENXML_UDF($idoc, ':ROOT:Customer');
Copy

Recommandations

  • Vérifiez si vous pouvez passer le chemin directement en paramètre dans votre code.

  • Pour toute assitance supplémentaire, contactez notre équipe de support à l’adresse suivante : snowconvert-support@snowflake.com

SSC-EWI-TS0043

Gravité

Medium

Certaines parties de la sortie du code ont été supprimées pour que l’exemple reste clair et concis.

Description

Cet avertissement apparaît pour la clause WITH XMLNAMESPACES qui n’est pas disponible 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
Copy

Code de sortie :

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

Recommandations

  • Pensez à utiliser des fonctions définies par l’utilisateur (UDFs) pour répliquer la fonctionnalité de votre code source. Vous trouverez ci-dessous des exemples d’UDFs qui peuvent vous aider à recréer le comportement original :

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

WITH XMLNAMESPACES ('uri' as ns1)
SELECT ProductID as 'ns1:ProductID',
       Name      as 'ns1:Name',
       Color     as 'ns1:Color'
FROM Product
FOR XML RAW
Copy
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;
Copy

connexesEWI

  1. SSC-PRF-TS0001 : Avertissement de performance - Le code contient une expression de table commune (CTE) qui pourrait être récursive. Vérifiez si vous devez ajouter le mot-clé “RECURSIVE”.

  2. SSC-EWI-TS0044 : la clause “FOR XML” ne peut pas être utilisée dans Snowflake car elle n’est pas prise en charge.

  3. SSC-FDM-TS0015 : veuillez noter que la fonction Regexp_Substr de Snowflake ne fonctionne qu’avec les expressions régulières POSIX.

SSC-EWI-TS0077

Gravité

Faible

Description

Cette erreur apparaît lorsque vous utilisez une clause de classement qui n’est pas prise en charge par 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
);
Copy

Code de sortie :

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

Recommandations

  • Aucune action n’est requise de votre part.

  • Pour une assistance supplémentaire, veuillez nous contacter à l’adresse suivante : snowconvert-support@snowflake.com

SSC-EWI-TS0026

Gravité

Faible

Description

Cet avertissement apparaît lorsqu’une expression de table commune (CTE) contenant une instruction DELETE FROM est convertie en instruction CREATE OR 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
Copy

Code de sortie :

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

Recommandations

  • Aucune action n’est requise de votre part.

  • Pour une assistance supplémentaire, veuillez nous contacter à l’adresse suivante : snowconvert-support@snowflake.com