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());
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);
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';
2024-02-08 16:52:55.317 -10:00
¶
SELECT
CONVERT_TIMEZONE('Pacific/Honolulu', CURRENT_TIMESTAMP() !!!RESOLVE EWI!!! /*** SSC-EWI-TS0070 - CURRENT_TIMESTAMP in At Time Zone statement may have a different behavior in certain cases ***/!!!);
2024-02-08 06:53:46.994 -1000
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';
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());
2024-02-08 16:33:49.143
Pour obtenir une assistance supplémentaire, veuillez contacter notre équipe de support à l’adresse suivante : snowconvert-support@snowflake.com
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;
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;
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
-- FOR XML
<TempTable Ref="100001" Des="Normal" Qty="1"/><TempTable Ref="100002" Des="Foobar" Qty="1"/><TempTable Ref="100003" Des="Hello World" Qty="2"/>
-- FOR XML RAW
<row Ref="100001" Des="Normal" Qty="1"/><row Ref="100002" Des="Foobar" Qty="1"/><row Ref="100003" Des="Hello World" Qty="2"/>
Snowflake¶
CREATE OR REPLACE TABLE TEMPTABLE (
Ref INT,
Des VARCHAR(100),
Qty INT
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
;
INSERT INTO tempTable VALUES (100001, 'Normal', 1), (100002, 'Foobar', 1), (100003, 'Hello World', 2);
-- FOR XML
SELECT
*
FROM
TempTable
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0044 - FOR XML AUTO CLAUSE IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
FOR XML AUTO;
-- FOR XML RAW
SELECT
*
FROM
TempTable
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0044 - FOR XML RAW CLAUSE IS NOT SUPPORTED IN SNOWFLAKE ***/!!!
FOR XML RAW;
-- FOR XML
<TempTable DES="Normal" QTY="1" REF="100001" /><TempTable DES="Foobar" QTY="1" REF="100002" /><TempTable DES="Hello World" QTY="2" REF="100003" />
-- FOR XML RAW
<row DES="Normal" QTY="1" REF="100001" /><row DES="Foobar" QTY="1" REF="100002" /><row DES="Hello World" QTY="2" REF="100003" />
Pour une assistance supplémentaire, veuillez nous contacter à l’adresse suivante : snowconvert-support@snowflake.com
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;
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;
$$;
Recommandations¶
Pour une assistance supplémentaire, veuillez nous contacter à l’adresse suivante : snowconvert-support@snowflake.com
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
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
$$
$$;
Recommandations¶
Pour obtenir une assistance supplémentaire, veuillez contacter notre équipe de support à l’adresse suivante : snowconvert-support@snowflake.com
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
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()`);
}
$$;
Recommandations¶
Pour une assistance supplémentaire, veuillez nous contacter à l’adresse suivante : snowconvert-support@snowflake.com
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
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;
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();
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 ***/!!!;
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;
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;
$$;
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
));
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
));
Recommandations¶
Pour obtenir une assistance supplémentaire, veuillez contacter notre équipe de support à l’adresse suivante : snowconvert-support@snowflake.com
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
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`);
$$
Recommandations¶
Créez d’abord un STAGE et un FILE FORMAT pour accéder au fichier.
Pour toute assistance supplémentaire, veuillez contacter notre équipe de support à l’adresse suivante : snowconvert-support@snowflake.com
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';
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';
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;
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;
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¶
Pour obtenir une assistance supplémentaire, veuillez contacter notre équipe de support à l’adresse suivante : snowconvert-support@snowflake.com
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;
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;
Recommandations¶
Pour obtenir une assistance supplémentaire, veuillez contacter notre équipe de support à l’adresse suivante : snowconvert-support@snowflake.com
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
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;
$$;
Recommandations¶
Pour obtenir une assistance supplémentaire, veuillez contacter notre équipe de support à l’adresse suivante : snowconvert-support@snowflake.com
connexesEWI¶
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;
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 ***/!!!
;
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¶
SSC-FDM-0020 : les résultats de plusieurs requêtes sont stockés dans des tables temporaires
SSC-EWI-0001 : jeton inconnu ou non valide trouvé dans la ligne de code source
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;
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;
$$;
Recommandations¶
Pour obtenir une assistance supplémentaire, veuillez contacter notre équipe de support à l’adresse suivante : snowconvert-support@snowflake.com
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);
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);
¶
Recommandations¶
Pour une assistance supplémentaire, veuillez nous contacter à l’adresse suivante : snowconvert-support@snowflake.com
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
Code de sortie :¶
!!!RESOLVE EWI!!! /*** SSC-EWI-TS0079 - DATABASE CONSOLE COMMAND 'CHECKIDENT' IS NOT SUPPORTED. ***/!!!
DBCC CHECKIDENT(@a, RESEED, @b) WITH NO_INFOMSGS;
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
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;
$$;
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
CASE WHEN (SELECT RESULT FROM CTE2)= 0 THEN
( SELECT 1 AS RESULT )
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
CASE WHEN (SELECT RESULT FROM CTE2)= 0 THEN
(
SELECT TransformedStatement3
FROM (
SELECT TransformedStatement2
FROM (
SELECT TransformedStatement1
) T1
) T2
)
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
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)
...
Recommandations¶
Pour obtenir une assistance supplémentaire, veuillez contacter notre équipe de support à l’adresse suivante : snowconvert-support@snowflake.com
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;
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;
$$;
Recommandations¶
Pour obtenir une assistance supplémentaire, veuillez contacter notre équipe de support à l’adresse suivante : snowconvert-support@snowflake.com
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))
);
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"}}'
;
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;
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;
$$;
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()');
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";
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¶
Pour obtenir une assistance supplémentaire, veuillez contacter notre équipe de support à l’adresse suivante : snowconvert-support@snowflake.com
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
);
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;
Recommandations¶
Consultez l’interface de ligne de commande SnowSQL (CLI) guide de l’utilisateur.
Pour une assistance supplémentaire, veuillez nous contacter à l’adresse suivante : snowconvert-support@snowflake.com
connexesEWI¶
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
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;
$$;
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¶
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
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
Recommandations¶
Pour une assistance supplémentaire, veuillez nous contacter à l’adresse suivante : snowconvert-support@snowflake.com
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
);
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"}}'
;
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;
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;
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;
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;
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)');
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";
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¶
Pour une assistance supplémentaire, veuillez nous contacter à l’adresse suivante : snowconvert-support@snowflake.com
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';
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'
;
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 :
Diviser la procédure en plusieurs parties
Exécuter manuellement la commande
PUT
correspondant à chaque instructionBULK 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;
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}`);
$$;
Recommandations¶
Extrayez et exécutez la commande
PUT
générée par l’instructionBULK 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()
Code de sortie¶
BEGIN
VARERRORMESSAGE := SQLERRM !!!RESOLVE EWI!!! /*** SSC-EWI-TS0073 - ERROR MESSAGE COULD BE DIFFERENT IN SNOWFLAKE ***/!!!;
END;
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
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;
$$;
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
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;
$$;
Recommandations¶
Pour obtenir une assistance supplémentaire, veuillez contacter notre équipe de support à l’adresse suivante : snowconvert-support@snowflake.com
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()};
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. ***/!!!;
connexesEWI¶
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;
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;
$$;
Recommandations¶
Pour une assistance supplémentaire, veuillez nous contacter à l’adresse suivante : snowconvert-support@snowflake.com
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)
);
Code de sortie :¶
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 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');
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
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;
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
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;
Pour une assistance supplémentaire, veuillez nous contacter à l’adresse suivante : snowconvert-support@snowflake.com
connexesEWI¶
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”.
SSC-EWI-TS0044 : la clause “FOR XML” ne peut pas être utilisée dans Snowflake car elle n’est pas prise en charge.
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
);
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"}}'
;
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
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;
Recommandations¶
Aucune action n’est requise de votre part.
Pour une assistance supplémentaire, veuillez nous contacter à l’adresse suivante : snowconvert-support@snowflake.com