SnowConvert AI - Différences fonctionnelles SQL Server-Azure Synapse¶
Applies to
SQL Server
Analyses Azure Synapse
SSC-FDM-TS0001¶
Note
Ce FDM est obsolète. Veuillez vous référer à la documentation SSC-EWI-TS0077.
Description¶
Ce message s’affiche lorsqu’il existe une clause de classement qui n’est pas prise en charge dans Snowflake.
Exemple de code¶
Code d’entrée :¶
SELECT 'a' COLLATE Albanian_BIN;
SELECT 'a' COLLATE Albanian_CI_AI;
CREATE TABLE ExampleTable (
ID INT,
Name VARCHAR(50) COLLATE collateName
);
Code généré :¶
SELECT 'a'
-- --** SSC-FDM-TS0001 - COLLATION Albanian_BIN NOT SUPPORTED **
-- COLLATE Albanian_BIN
;
SELECT 'a'
-- --** SSC-FDM-TS0001 - COLLATION Albanian_CI_AI NOT SUPPORTED **
-- COLLATE Albanian_CI_AI
;
CREATE OR REPLACE TABLE ExampleTable (
ID INT,
Name VARCHAR(50)
-- --** SSC-FDM-TS0001 - COLLATION collateName NOT SUPPORTED **
-- COLLATE collateName
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
;
Meilleures pratiques¶
Aucune action supplémentaire de la part de l’utilisateur n’est requise.
Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.
SSC-FDM-TS0002¶
Description¶
Ce message s’affiche lorsqu’il existe une clause de classement qui n’est pas prise en charge dans Snowflake.
Exemple de code¶
Code d’entrée :¶
SELECT 'a' COLLATE Latin1_General_CI_AS_WS;
Code généré :¶
SELECT 'a' COLLATE 'EN-CI-AS' /*** SSC-FDM-TS0002 - COLLATION FOR VALUE WS NOT SUPPORTED ***/;
Meilleures pratiques¶
Aucune action supplémentaire de la part de l’utilisateur n’est requise.
Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.
SSC-FDM-TS0003¶
XP_LOGININFO mappé vers UDF personnalisée
Description¶
Ce message s’affiche lorsque la procédure XP_LOGININFO est exécutée et renvoie l’ensemble de colonnes suivant ([Consultez la documentation SQL SERVER pour plus d’informations].(https://learn.microsoft.com/fr-fr/sql/relational-databases/system-stored-procedures/xp-logininfo-transact-sql?view=sql-server-ver16))
| account name | type | privilege | mapped login name | permission path |
Pour répliquer ce comportement, il existe une requête qui sélectionne les colonnes dans la vue APPLICABLE_ROLES dans Snowflake, qui renvoie l’ensemble de colonnes suivant ([Consultez la documentation SnowFlake pour plus d’informations].(https://docs.snowflake.com/fr/sql-reference/info-schema/applicable_roles.html))
GRANTEE |
ROLE_NAME |
ROLE_OWNER |
IS_GRANTABLE |
|---|
Les colonnes d’origine de SQL Server sont mappées comme indiqué dans le tableau suivant. Elles peuvent ne pas être complètement équivalentes.
| SQL Server | SnowFlake | |
|---|---|---|
| account name | GRANTEE | |
| type | ROLE_OWNER | |
| privilege | ROLE_NAME | |
| mapped login name | GRANTEE | |
| permission path | NULL |
Exemple de code¶
Code d’entrée :¶
EXEC xp_logininfo
EXEC xp_logininfo 'USERNAME'
Code généré :¶
--** SSC-FDM-TS0003 - XP_LOGININFO MAPPED TO CUSTOM UDF XP_LOGININFO_UDF AND MIGHT HAVE DIFFERENT BEHAVIOR **
SELECT
*
FROM
TABLE(XP_LOGININFO_UDF());
--** SSC-FDM-TS0003 - XP_LOGININFO MAPPED TO CUSTOM UDF XP_LOGININFO_UDF AND MIGHT HAVE DIFFERENT BEHAVIOR **
SELECT
*
FROM
TABLE(XP_LOGININFO_UDF('USERNAME'));
Meilleures pratiques¶
Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.
SSC-FDM-TS0004¶
Description¶
Ce message s’affiche lorsqu’un BULK INSERT a été transformé et qu’une commande PUT est ajoutée au code de sortie. Cela est dû au fait que la commande PUT ne peut pas être exécutée en utilisant l’UI Web SnowSQL. Afin de l’exécuter avec succès, tout utilisateur doit d’abord installer le SnowCLI.
Exemple de code¶
Code d’entrée :¶
BULK INSERT #temptable FROM 'path/to/file.txt'
WITH
(
FIELDTERMINATOR ='\t',
ROWTERMINATOR ='\n'
);
Code généré :¶
CREATE OR REPLACE FILE FORMAT FILE_FORMAT_638466175888203490
FIELD_DELIMITER = '\t'
RECORD_DELIMITER = '\n';
CREATE OR REPLACE STAGE STAGE_638466175888203490
FILE_FORMAT = FILE_FORMAT_638466175888203490;
--** SSC-FDM-TS0004 - PUT STATEMENT IS NOT SUPPORTED ON WEB UI. YOU SHOULD EXECUTE THE CODE THROUGH THE SNOWFLAKE CLI **
PUT file://path/to/file.txt @STAGE_638466175888203490 AUTO_COMPRESS = FALSE;
--** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "#temptable" **
COPY INTO T_temptable FROM @STAGE_638466175888203490/file.txt;
Meilleures pratiques¶
Installez SnowCLI.
Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.
SSC-FDM-TS0005¶
TRY_CONVERT/TRY_CAST n’a pas pu être converti en TRY_CAST.
Description¶
Ce FMD est ajouté lorsqu’un TRY_CONVERT ou TRY_CAST ne peut pas être converti en un TRY_CAST dans Snowflake.
TRY_CAST de Snowflake a une limitation, car il autorise uniquement la conversion des expressions de chaîne. Cependant, les fonctions TRY_CONVERT et TRY_CAST de Transact autorisent toute expression de type de données.
Actuellement, la transformation de TRY_CONVERT ou TRY_CAST vers le TRY_CAST de Snowflake est exécutée uniquement pour les expressions de chaîne ou pour les expressions que l’outil peut identifier comme des chaînes dans son contexte.
Exemple de code¶
Code d’entrée :¶
SELECT TRY_CAST(14.85 AS INT);
SELECT TRY_CONVERT(VARCHAR, 1234);
SELECT TRY_CONVERT(CHAR, 1);
SELECT TRY_CONVERT(SQL_VARIANT, '2017-01-01 12:00:00');
SELECT TRY_CONVERT(GEOGRAPHY, 'LINESTRING(-122.360 47.656, -122.343 47.656 )');
Code généré :¶
SELECT
CAST(14.85 AS INT) /*** SSC-FDM-TS0005 - TRY_CONVERT/TRY_CAST COULD NOT BE CONVERTED TO TRY_CAST ***/;
SELECT
TO_VARCHAR(1234);
SELECT
TO_CHAR(1);
SELECT
TO_VARIANT('2017-01-01 12:00:00');
SELECT
TO_GEOGRAPHY('LINESTRING(-122.360 47.656, -122.343 47.656 )');
Meilleures pratiques¶
Aucune action supplémentaire de la part de l’utilisateur n’est requise.
Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.
SSC-FDM-TS0006¶
La clause EXECUTE AS « user_name » n’existe pas dans Snowflake, et l’utilisateur qui appelle la procédure doit disposer de tous les privilèges requis.
Description¶
Ce message s’affiche lorsque SnowConvert AI trouve une procédure avec une clause EXECUTE AS 'user_name'. Celle-ci n’est pas prise en charge dans Snowflake. Elle est donc modifiée en EXECUTE AS CALLER.
Cette clause spécifie le contexte de sécurité dans lequel la procédure doit être exécutée.
Note
Pour plus de détails, consultez la [documentation](https://learn.microsoft.com/fr-fr/sql/t-sql/statements/execute-as-clause-transact-sql?view=sql-server-ver16&tabs =sqlserver) sur la fonctionnalité de la clause.
Exemple de code¶
Code d’entrée :¶
CREATE PROCEDURE SelectAllCustomers
WITH EXECUTE AS 'user_name'
AS
BEGIN
SELECT * FROM Customers;
END;
Code généré :¶
--** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "Customers" **
CREATE OR REPLACE PROCEDURE SelectAllCustomers ()
RETURNS TABLE()
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
EXECUTE AS CALLER
--** SSC-FDM-TS0006 - EXECUTE AS 'user_name' CLAUSE DOES NOT EXIST IN SNOWFLAKE AND THE USER CALLING THE PROCEDURE SHOULD HAVE ALL THE REQUIRED PRIVILEGES **
AS
$$
DECLARE
ProcedureResultSet RESULTSET;
BEGIN
ProcedureResultSet := (
SELECT
*
FROM
Customers);
RETURN TABLE(ProcedureResultSet);
END;
$$;
Meilleures pratiques¶
Aucune action supplémentaire de la part de l’utilisateur n’est requise.
Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.
SSC-FDM-TS0007¶
La clause FOR REPLICATION n’existe pas dans Snowflake.
Description¶
Ce message s’affiche lorsque SnowConvert AI trouve une procédure avec une clause FOR REPLICATION. Celle-ci n’est pas prise en charge dans Snowflake. Elle est donc supprimée.
Cette clause spécifie que la procédure est créée pour la réplication. Par conséquent, elle ne peut pas être exécutée sur l’abonné.
Note
Pour plus de détails, consultez la documentation sur la fonctionnalité de la clause.
Exemple de code¶
Code d’entrée :¶
CREATE PROCEDURE SelectAllCustomers
WITH FOR REPLICATION
AS
BEGIN
SELECT * FROM Customers;
END;
Code généré :¶
--** SSC-FDM-0007 - MISSING DEPENDENT OBJECT "Customers" **
CREATE OR REPLACE PROCEDURE SelectAllCustomers ()
RETURNS TABLE()
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
EXECUTE AS CALLER
--** SSC-FDM-TS0007 - FOR REPLICATION CLAUSE DOES NOT EXIST IN SNOWFLAKE **
AS
$$
DECLARE
ProcedureResultSet RESULTSET;
BEGIN
ProcedureResultSet := (
SELECT
*
FROM
Customers);
RETURN TABLE(ProcedureResultSet);
END;
$$;
Meilleures pratiques¶
Aucune action supplémentaire de la part de l’utilisateur n’est requise.
Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.
SSC-FDM-TS0008¶
La fonction FORMATMESSAGE a été convertie en UDF.
Description¶
Cet avertissement est ajouté, car la fonction FORMATMESSAGE est utilisée et a été remplacée par FORMATMESSAGE_UDF. Cet avertissement est ajouté, car l’FORMATMESSAGE_UDF utilisé pour remplacer le FORMATMESSAGE ne gère pas correctement tous les types de formats et peut générer une erreur dans certaines conditions.
Les valeurs numériques non signées qui sont indiquées comme négatives conserveront leur signe au lieu de changer de valeur. Par ailleurs, l’espace réservé %I64d n’est pas pris en charge par l’UDF, de sorte qu’il générera une erreur lorsqu’il sera utilisé.
Dans le FORMATMESSAGE_UDF, une erreur se produira si le nombre d’arguments donné est différent du nombre d’espaces réservés.
Cette UDF ne prend pas en charge l’utilisation des IDs numériques des messages.
Exemple de code¶
Code d’entrée :¶
SELECT FORMATMESSAGE('Unsigned int %u, %u', 50, -50); -- Unsigned int 50, 4294967246
SELECT FORMATMESSAGE('Unsigned octal %o, %o', 50, -50); -- Unsigned octal 62, 37777777716
SELECT FORMATMESSAGE('Unsigned hexadecimal %X, %x', -11, -50); -- Unsigned hexadecimal FFFFFFF5, ffffffce
SELECT FORMATMESSAGE('Unsigned octal with prefix: %#o', -50); -- Unsigned octal with prefix: 037777777716
SELECT FORMATMESSAGE('Unsigned hexadecimal with prefix: %#X, %x', -11,-50); -- Unsigned hexadecimal with prefix: 0XFFFFFFF5, ffffffce
SELECT FORMATMESSAGE('Bigint %I64d', 3000000000); -- Bigint 3000000000
SELECT FORMATMESSAGE('My message: %s %s %s', 'Hello', 'World'); -- My message: Hello World (null)
Code généré :¶
SELECT
--** SSC-FDM-TS0008 - FORMATMESSAGE WAS CONVERTED TO CUSTOM UDF FORMATMESSAGE_UDF AND IT MIGHT HAVE A DIFFERENT BEHAVIOR. **
FORMATMESSAGE_UDF('Unsigned int %u, %u', ARRAY_CONSTRUCT(50, -50)); -- Unsigned int 50, 4294967246
SELECT
--** SSC-FDM-TS0008 - FORMATMESSAGE WAS CONVERTED TO CUSTOM UDF FORMATMESSAGE_UDF AND IT MIGHT HAVE A DIFFERENT BEHAVIOR. **
FORMATMESSAGE_UDF('Unsigned octal %o, %o', ARRAY_CONSTRUCT(50, -50)); -- Unsigned octal 62, 37777777716
SELECT
--** SSC-FDM-TS0008 - FORMATMESSAGE WAS CONVERTED TO CUSTOM UDF FORMATMESSAGE_UDF AND IT MIGHT HAVE A DIFFERENT BEHAVIOR. **
FORMATMESSAGE_UDF('Unsigned hexadecimal %X, %x', ARRAY_CONSTRUCT(-11, -50)); -- Unsigned hexadecimal FFFFFFF5, ffffffce
SELECT
--** SSC-FDM-TS0008 - FORMATMESSAGE WAS CONVERTED TO CUSTOM UDF FORMATMESSAGE_UDF AND IT MIGHT HAVE A DIFFERENT BEHAVIOR. **
FORMATMESSAGE_UDF('Unsigned octal with prefix: %#o', ARRAY_CONSTRUCT(-50)); -- Unsigned octal with prefix: 037777777716
SELECT
--** SSC-FDM-TS0008 - FORMATMESSAGE WAS CONVERTED TO CUSTOM UDF FORMATMESSAGE_UDF AND IT MIGHT HAVE A DIFFERENT BEHAVIOR. **
FORMATMESSAGE_UDF('Unsigned hexadecimal with prefix: %#X, %x', ARRAY_CONSTRUCT(-11, -50)); -- Unsigned hexadecimal with prefix: 0XFFFFFFF5, ffffffce
SELECT
--** SSC-FDM-TS0008 - FORMATMESSAGE WAS CONVERTED TO CUSTOM UDF FORMATMESSAGE_UDF AND IT MIGHT HAVE A DIFFERENT BEHAVIOR. **
FORMATMESSAGE_UDF('Bigint %I64d', ARRAY_CONSTRUCT(3000000000)); -- Bigint 3000000000
SELECT
--** SSC-FDM-TS0008 - FORMATMESSAGE WAS CONVERTED TO CUSTOM UDF FORMATMESSAGE_UDF AND IT MIGHT HAVE A DIFFERENT BEHAVIOR. **
FORMATMESSAGE_UDF('My message: %s %s %s', ARRAY_CONSTRUCT('Hello', 'World')); -- My message: Hello World (null)
Meilleures pratiques¶
Évitez d’utiliser l’espace réservé
%I64ddans le message.Utilisez directement le message sous forme de chaîne au lieu d’utiliser un ID de message pour le premier argument.
Assurez-vous que le nombre d’espaces réservés est identique au nombre d’arguments après le message.
Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.
SSC-FDM-TS0009¶
Encrypted with non pris en charge dans Snowflake.
Description¶
Cet avertissement est ajouté lorsque ENCRYPTED WITH est utilisée dans une définition de colonnes. Comme cette clause n’est pas prise en charge dans Snowflake, elle est en cours de suppression, et un avertissement est ajouté.
Exemple de code¶
Code d’entrée :¶
CREATE TABLE [SCHEMA1].[TABLE1] (
[COL1] NVARCHAR(60)
ENCRYPTED WITH (
COLUMN_ENCRYPTION_KEY = MyCEK,
ENCRYPTION_TYPE = RANDOMIZED,
ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256'
)
);
Code généré :¶
CREATE OR REPLACE TABLE SCHEMA1.TABLE1 (
COL1 VARCHAR(60)
-- --** SSC-FDM-TS0009 - ENCRYPTED WITH NOT SUPPORTED IN SNOWFLAKE **
-- ENCRYPTED WITH (
-- COLUMN_ENCRYPTION_KEY = MyCEK,
-- ENCRYPTION_TYPE = RANDOMIZED,
-- ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256'
-- )
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"transact"}}'
;
Meilleures pratiques¶
Aucune action supplémentaire de la part de l’utilisateur n’est requise.
Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.
SSC-FDM-TS0010¶
La fonction CURRENT_DATABASE a un comportement différent dans certains cas.
Description¶
Cet EWI est ajouté lorsque la fonction DB_NAME est transformée en CURRENT_DATABASE, car Snowflake ne prend pas en charge le paramètre database_id, et la fonction CURRENT_DATABASE retournera toujours le nom de la base de données actuelle.
Exemple de code¶
Code d’entrée :¶
SELECT DB_NAME(someId);
Code généré :¶
SELECT
CURRENT_DATABASE() /*** SSC-FDM-TS0010 - CURRENT_DATABASE function has different behavior in certain cases ***/;
Meilleures pratiques¶
Aucune action supplémentaire de la part de l’utilisateur n’est requise.
Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.
SSC-FDM-TS0011¶
La valeur par défaut n’est pas autorisée dans Snowflake.
Note
Ce FDM est obsolète. Veuillez vous référer à la documentation SSC-EWI-TS0078.
Description¶
Cette erreur est ajoutée au code lorsque des expressions telles que des appels de fonctions, des noms de variables ou des constantes nommées suivent l’option par défaut.
Snowflake ne prend en charge que les constantes explicites telles que les nombres ou les chaînes.
Exemple de code¶
Code d’entrée :¶
ALTER TABLE
T_ALTERTABLETEST
ADD
COLUMN COL10 INTEGER DEFAULT RANDOM(10);
Code généré :¶
--** SSC-FDM-0007 - MISSING DEPENDENT OBJECTS "T_ALTERTABLETEST", "RANDOM" **
ALTER TABLE IF EXISTS T_ALTERTABLETEST
ADD
COLUMN COL10 INTEGER
-- --** SSC-FDM-TS0011 - DEFAULT OPTION NOT ALLOWED IN SNOWFLAKE **
-- DEFAULT RANDOM(10)
;
¶
Meilleures pratiques¶
Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.
SSC-FDM-TS0012¶
Les informations pour la colonne n’ont pas été trouvées. STRING est utilisé pour correspondre à l’opération CAST.
Description¶
Cet EWI est ajouté dans les fonctions définies par l’utilisateur à valeurs de table où le type de retour d’une colonne ne peut pas être déterminé pendant la conversion. STRING est utilisé par défaut pour correspondre à l’opération CAST dans l’instruction SELECT <!–TODO: search for a broken reference.->.
Exemple de code¶
Code d’entrée :¶
CREATE FUNCTION GetDepartmentInfo()
RETURNS TABLE
AS
RETURN
(
SELECT DepartmentID, Name, GroupName
FROM HumanResources.Department
);
Code généré :¶
CREATE OR REPLACE FUNCTION GetDepartmentInfo ()
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
$$
SELECT
CAST(DepartmentID AS STRING),
CAST(Name AS STRING),
CAST(GroupName AS STRING)
FROM
HumanResources.Department
$$;
Meilleures pratiques¶
L’utilisateur doit vérifier quel est le type de données correct qui n’a pas pu être trouvé et le modifier dans la définition de l’instruction
RETURNS TABLE.Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.
SSC-FDM-TS0013¶
Les lignes de curseur de l’Exécution de scripts Snowflake ne sont pas modifiables.
Description¶
Cet EWI est ajouté lorsque les curseurs sont ouverts à la modification dans le code d’entrée. L’Exécution de scripts Snowflake ne permet pas de modifier les lignes de curseur.
Exemple de code :¶
Code d’entrée :¶
CREATE OR ALTER PROCEDURE modifiablecursorTest
AS
BEGIN
-- Should be marked with SSC-FDM-TS0013
DECLARE CursorVar CURSOR
FOR
SELECT FirstName
FROM vEmployee;
DECLARE CursorVar2 INSENSITIVE CURSOR
FOR
SELECT FirstName
FROM vEmployee;
DECLARE CursorVar3 CURSOR KEYSET SCROLL_LOCKS
FOR
SELECT FirstName
FROM vEmployee;
DECLARE CursorVar4 CURSOR DYNAMIC OPTIMISTIC
FOR
SELECT FirstName
FROM vEmployee;
DECLARE CursorVar6 CURSOR STATIC
FOR
SELECT FirstName
FROM vEmployee;
DECLARE CursorVar7 CURSOR READ_ONLY
FOR
SELECT FirstName
FROM vEmployee;
-- Shouid not be marked
DECLARE CursorVar5 CURSOR STATIC READ_ONLY
FOR
SELECT FirstName
FROM vEmployee;
RETURN 'DONE';
END;
Code généré :¶
CREATE OR REPLACE PROCEDURE modifiablecursorTest ()
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-FDM-TS0013
--** SSC-FDM-TS0013 - SNOWFLAKE SCRIPTING CURSOR ROWS ARE NOT MODIFIABLE **
CursorVar CURSOR
FOR
SELECT
FirstName
FROM
vEmployee;
--** SSC-FDM-TS0013 - SNOWFLAKE SCRIPTING CURSOR ROWS ARE NOT MODIFIABLE **
CursorVar2 CURSOR
FOR
SELECT
FirstName
FROM
vEmployee;
--** SSC-FDM-TS0013 - SNOWFLAKE SCRIPTING CURSOR ROWS ARE NOT MODIFIABLE **
CursorVar3 CURSOR
FOR
SELECT
FirstName
FROM
vEmployee;
--** SSC-FDM-TS0013 - SNOWFLAKE SCRIPTING CURSOR ROWS ARE NOT MODIFIABLE **
CursorVar4 CURSOR
FOR
SELECT
FirstName
FROM
vEmployee;
--** SSC-FDM-TS0013 - SNOWFLAKE SCRIPTING CURSOR ROWS ARE NOT MODIFIABLE **
CursorVar6 CURSOR
FOR
SELECT
FirstName
FROM
vEmployee;
--** SSC-FDM-TS0013 - SNOWFLAKE SCRIPTING CURSOR ROWS ARE NOT MODIFIABLE **
CursorVar7 CURSOR
FOR
SELECT
FirstName
FROM
vEmployee;
-- Shouid not be marked
CursorVar5 CURSOR
FOR
SELECT
FirstName
FROM
vEmployee;
BEGIN
RETURN 'DONE';
END;
$$;
Meilleures pratiques¶
Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.
SSC-FDM-TS0014¶
Colonne calculée transformée
Description¶
Cet avertissement est ajouté lorsqu’une colonne calculée SQL Server est transformée en son équivalent Snowflake. Elle est ajoutée car, dans certains cas, l’équivalence fonctionnelle pourrait être affectée.
Exemple de code¶
Code d’entrée :¶
CREATE TABLE [TestTable](
[Col1] AS (CONVERT ([REAL], ExpressionValue))
);
Code généré :¶
CREATE OR REPLACE TABLE TestTable (
Col1 REAL AS (CAST(ExpressionValue AS REAL)) /*** SSC-FDM-TS0014 - COMPUTED COLUMN WAS TRANSFORMED TO ITS SNOWFLAKE EQUIVALENT, FUNCTIONAL EQUIVALENCE VERIFICATION PENDING. ***/
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
;
Meilleures pratiques¶
Aucune action supplémentaire de la part de l’utilisateur n’est requise. Cet avertissement est simplement donné à titre informatif.
Ajoutez des modifications manuelles à l’expression non transformée.
Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.
SSC-FDM-TS0016¶
Les colonnes XML dans Snowflake peuvent avoir un format différent.
Description¶
Cet avertissement est ajouté lorsqu’une clause FOR XML SQL Server est transformée en son équivalent Snowflake. Il est ajouté, car les colonnes en XML pourraient être différentes.
Exemple de code¶
Le tableau employee ci-dessous est donné à titre d’exemple.
Id |
Nom |
Hint |
|---|---|---|
1 |
Kinslee Park |
Développeur |
2 |
Ezra Mata |
Développeur |
3 |
Aliana Quinn |
Manager |
Code d’entrée :¶
Code¶
SELECT
e.id,
e.name as full_name,
e.hint
FROM
employee e
FOR XML PATH;
Sortie¶
<row>
<id>1</id>
<full_name>Kinslee Park</full_name>
<hint>Developer</hint>
</row>
<row>
<id>2</id>
<full_name>Ezra Mata</full_name>
<hint>Developer</hint>
</row>
<row>
<id>3</id>
<full_name>Aliana Quinn</full_name>
<hint>Manager</hint>
</row>
Code généré :¶
Code¶
SELECT
--** SSC-FDM-TS0016 - XML COLUMNS IN SNOWFLAKE MIGHT HAVE A DIFFERENT FORMAT **
FOR_XML_UDF(OBJECT_CONSTRUCT('id', e.id, 'full_name', e.name, 'hint', e.hint), 'row')
FROM
employee e;
Sortie¶
<row type="OBJECT">
<full_name type="VARCHAR">Kinslee Park</full_name>
<hint type="VARCHAR">Developer</hint>
<id type="INTEGER">1</id>
</row>
<row type="OBJECT">
<full_name type="VARCHAR">Ezra Mata</full_name>
<hint type="VARCHAR">Developer</hint>
<id type="INTEGER">2</id>
</row>
<row type="OBJECT">
<full_name type="VARCHAR">Aliana Quinn</full_name>
<hint type="VARCHAR">Manager</hint>
<id type="INTEGER">3</id>
</row>
Meilleures pratiques¶
Aucune action supplémentaire de la part de l’utilisateur n’est requise. Cet avertissement est simplement donné à titre informatif.
Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.
SSC-FDM-TS0017¶
La fonction CURRENT_USER ne prend pas en charge un ID utilisateur en tant que paramètre.
Description¶
Cet EWI est ajouté lorsque des fonctions comme SUSER_NAME ou SUSER_SNAME contiennent l’identificateur de l’utilisateur en tant que paramètre, car ce dernier n’est pas pris en charge dans la fonction CURRENT_USER dans Snowflake.
Code d’entrée :¶
SELECT SUSER_NAME(0x010500000000000515000000a065cf7e784b9b5fe77c87705a2e0000);
Code généré :¶
SELECT
CURRENT_USER() /*** SSC-FDM-TS0017 - User ID parameter used in SUSER_NAME function is not supported in CURRENT_USER function and it was removed. ***/;
Meilleures pratiques¶
Aucune action supplémentaire de la part de l’utilisateur n’est requise.
Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.
SSC-FDM-TS0018¶
La commande de console de base de données n’est pas prise en charge.
Note
Ce FDM est obsolète. Veuillez vous référer à la documentation SSC-EWI-TS0079.
Description¶
Ce FMD est ajouté lorsque SnowConvert AI trouve une instruction DBCC à l’intérieur du code d’entrée.\ La plupart des instructions DBCC ne sont pas prises en charge dans Snowflake.
Exemple de code¶
Code d’entrée :¶
DBCC CHECKIDENT(@a, RESEED, @b) WITH NO_INFOMSGS
Code généré :¶
----** SSC-FDM-TS0018 - DATABASE CONSOLE COMMAND 'CHECKIDENT' IS NOT SUPPORTED. **
--DBCC CHECKIDENT(@a, RESEED, @b) WITH NO_INFOMSGS
Meilleures pratiques¶
Aucune action supplémentaire de la part de l’utilisateur n’est requise. Cet avertissement est simplement donné à titre informatif.
Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.
SSC-FDM-TS0019¶
Le message d’erreur RAISERROR peut différer à cause du format de chaîne SQL Server.
Description¶
Cet EWI est ajouté pour notifier que le message d’erreur RAISERROR peut différer à cause du format de chaîne SQL Server.
Exemple de code¶
Code d’entrée :¶
CREATE PROCEDURE RAISERROR_PROCEDURE
AS
BEGIN
RAISERROR ('This is a sample error message with the first parameter %d and the second parameter %*.*s',
10,
1,
123,
7,
7,
'param2');
END
Code généré :¶
CREATE OR REPLACE PROCEDURE RAISERROR_PROCEDURE ()
RETURNS VARCHAR
LANGUAGE SQL
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},{"attributes":{"component":"transact"}}'
EXECUTE AS CALLER
AS
$$
BEGIN
--** SSC-FDM-TS0019 - RAISERROR ERROR MESSAGE MAY DIFFER BECAUSE OF THE SQL SERVER STRING FORMAT **
SELECT
RAISERROR_UDF('This is a sample error message with the first parameter %d and the second parameter %*.*s',
10,
1, array_construct(
123,
7,
7,
'param2'));
END;
$$;
Meilleures pratiques¶
Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.
SSC-FDM-TS0020¶
La contrainte par défaut a été commentée et peut avoir été ajoutée à une définition de table.
Description¶
Ce FDM est ajouté lorsque la contrainte par défaut est présente dans une instruction Alter Table.
Actuellement, la prise en charge de cette contrainte n’est pas disponible. Une solution de contournement pour la transformer consiste à définir la table avant d’utiliser Alter Table. Cela permet à SnowConvert AI d’identifier les références, et la contrainte par défaut est consolidée dans la définition de la table. Sinon, la contrainte est uniquement commentée.
Exemple de code¶
Code d’entrée :¶
CREATE TABLE table1(
col1 integer,
col2 varchar collate Latin1_General_CS,
col3 date
);
ALTER TABLE table1
ADD col4 integer,
CONSTRAINT col1_constraint DEFAULT 50 FOR col1,
CONSTRAINT col1_constraint DEFAULT (getdate()) FOR col1;
Code généré :¶
CREATE OR REPLACE TABLE table1 (
col1 INTEGER DEFAULT 50,
col2 VARCHAR COLLATE 'EN-CS',
col3 DATE
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"transact"}}'
;
ALTER TABLE table1
ADD col4 INTEGER;
----** SSC-FDM-TS0020 - DEFAULT CONSTRAINT MAY HAVE BEEN ADDED TO TABLE DEFINITION **
--ALTER TABLE table1
--ADD
--CONSTRAINT col1_constraint DEFAULT 50 FOR col1
;
----** SSC-FDM-TS0020 - DEFAULT CONSTRAINT MAY HAVE BEEN ADDED TO TABLE DEFINITION **
--ALTER TABLE table1
--ADD
--CONSTRAINT col1_constraint DEFAULT (CURRENT_TIMESTAMP() :: TIMESTAMP) FOR col1
;
Problèmes connus¶
Lorsque différentes contraintes par défaut seront déclarées sur la même colonne, seule la première sera reflétée dans l’instruction Create Table.
Lorsqu’une contrainte par défaut est déclarée sur une colonne manquante, la transformation ne peut pas être effectuée en raison du manque de dépendances.
Meilleures pratiques¶
Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.
SSC-FDM-TS0021¶
Une MASKING POLICY a été créée en tant que substitut pour MASKED WITH.
Note
Certaines parties du code de sortie sont omises pour des raisons de clarté.
Description¶
Cet EWI est ajouté lorsque l’instruction Alter Table contient une clause MASKED WITH. Celui-ci est ajouté pour indiquer qu’une valeur approximative MASKING POLICY a été créée en tant que substitut pour la fonction MASKED WITH.
Exemple de code¶
Code d’entrée :¶
ALTER TABLE table_name
ALTER COLUMN column_name
ADD MASKED WITH (FUNCTION = 'default()');
Code généré :¶
--** SSC-FDM-TS0022 - 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/*** SSC-FDM-TS0021 - A MASKING POLICY WAS CREATED AS SUBSTITUTE FOR MASKED WITH ***/ SET MASKING POLICY "default";
Note
La MASKING POLICY sera créée avant l’instruction ALTER TABLE. De plus, elle devrait avoir un comportement approximatif. Quelques ajustements peuvent être nécessaires en ce qui concerne les rôles et les privilèges des utilisateurs.
Meilleures pratiques¶
Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.
SSC-FDM-TS0022¶
L’utilisateur doit préalablement définir le rôle de masquage.
Note
Certaines parties du code de sortie sont omises pour des raisons de clarté.
Description¶
Cet EWI se produit lorsqu’une MASKING POLICY est créée et qu’un rôle ou privilège doit y être lié pour que le masquage des données puisse fonctionner correctement.
Exemple de code¶
Code d’entrée¶
ALTER TABLE tableName
ALTER COLUMN columnName
ADD MASKED WITH (FUNCTION = 'partial(1, "xxxxx", 1)');
Code généré :¶
--** SSC-FDM-TS0022 - 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/*** SSC-FDM-TS0021 - A MASKING POLICY WAS CREATED AS SUBSTITUTE FOR MASKED WITH ***/ SET MASKING POLICY "partial_1_xxxxx_1";
Note
Comme indiqué à la ligne 6, il existe un espace réservé où les rôles définis peuvent être placés. Il y a de la place pour une ou plusieurs valeurs séparées par des virgules. De plus, l’utilisation de guillemets simples est ici obligatoire pour chacune des valeurs.
Meilleures pratiques¶
Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.
SSC-FDM-TS0023¶
La fonction d’erreur pourrait être différente dans Snowflake.
Description¶
Cet EWI est ajouté dans la transformation des fonctions ERRORs suivantes en raison du changement de comportement correspondant.
ERROR_MESSAGE Le message de SQLERRM pourrait être différent dans Snowflake.
ERROR_STATE La propriété SQLSTATE cible pourrait renvoyer un nombre différent en raison de différences de plateforme.
ERROR_PROCEDURE La transformation a été modifiée pour renvoyer la procédure stockée dans laquelle la fonction est appelée.
Code d’entrée :¶
CREATE PROCEDURE ProcError
AS
BEGIN
Declare @ErrorState INT = ERROR_STATE();
Declare @ErrorMessage INT = ERROR_MESSAGE();
Declare @ErrorProc INT = ERROR_PROCEDURE();
Select 1;
END;
Code généré¶
CREATE OR REPLACE PROCEDURE ProcError ()
RETURNS TABLE()
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "transact", "convertedOn": "09/01/2025", "domain": "no-domain-provided" }}'
EXECUTE AS CALLER
AS
$$
DECLARE
ERRORSTATE INT := SQLSTATE /*** SSC-FDM-TS0023 - ERROR STATE COULD BE DIFFERENT IN SNOWFLAKE ***/;
ERRORMESSAGE INT := SQLERRM /*** SSC-FDM-TS0023 - ERROR MESSAGE COULD BE DIFFERENT IN SNOWFLAKE ***/;
ERRORPROC INT := 'ProcError' /*** SSC-FDM-TS0023 - ERROR PROCEDURE NAME COULD BE DIFFERENT IN SNOWFLAKE ***/;
ProcedureResultSet RESULTSET;
BEGIN
ProcedureResultSet := (
Select 1);
RETURN TABLE(ProcedureResultSet);
END;
$$;
Recommandation¶
Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.
SSC-FDM-TS0024¶
CURRENT_TIMESTAMP dans l’instruction At Time Zone peut avoir un comportement différent dans certains cas.
Description¶
Ce FDM est ajouté lorsque At Time Zone possède l’CURRENT_TIMESTAMP. En effet, le résultat peut différer dans certains cas.
La principale différence est que dans SQL Server, CURRENT_TIMESTAMP renvoie la date et l’heure actuelles du système dans le fuseau horaire du serveur, tandis que dans Snowflake, CURRENT_TIMESTAMP renvoie la date et l’heure actuelles dans le fuseau horaire UTC (temps universel coordonné).
Code d’entrée :¶
SQL Server¶
SELECT current_timestamp at time zone 'Hawaiian Standard Time';
Résultat¶
2024-02-08 16:52:55.317 -10:00
Code généré :¶
Snowflake¶
SELECT
CONVERT_TIMEZONE('Pacific/Honolulu', CURRENT_TIMESTAMP() /*** SSC-FDM-TS0024 - CURRENT_TIMESTAMP in At Time Zone statement may have a different behavior in certain cases ***/);
Résultat¶
2024-02-08 06:53:46.994 -1000
Meilleures pratiques¶
Ceci est un exemple si vous souhaitez conserver le même format dans Snowflake.
SQL Server¶
SELECT current_timestamp at time zone 'Hawaiian Standard Time';
Résultat¶
2024-02-08 16:33:49.143 -10:00
Dans Snowflake, vous pouvez utiliser ALTER SESSION pour modifier le fuseau horaire par défaut. Par exemple :
Snowflake¶
ALTER SESSION SET TIMEZONE = 'Pacific/Honolulu';
SELECT
CONVERT_TIMEZONE('Pacific/Honolulu', 'UTC', CURRENT_TIMESTAMP());
Résultat¶
2024-02-08 16:33:49.143
Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.
SSC-FDM-TS0025¶
DB_ID_UDF peut avoir un comportement différent dans certains cas.
Description¶
Ce FDM est ajouté pour préciser que l’DB_ID_UDF tente d’émuler la fonction SqlServer DB_ID aussi bien que possible. Dans SqlServer, l’identificateur attribué à une base de données est unique, et si la base de données est supprimée, cet ID ne sera plus jamais utilisé à nouveau ; sinon, dans Snowflake, cet identificateur correspond au numéro attribué à la base de données lors de sa création. Il est également unique, mais il s’agit d’un numéro consécutif, ce qui signifie que si cette base de données est supprimée, ce numéro sera attribué à la base de données qui a été créée après la base de données supprimée.
Code d’entrée :¶
SQL Server¶
SELECT DB_ID('my_database');
Résultat¶
6
Code généré :¶
Snowflake¶
SELECT
DB_ID_UDF('my_database') /*** SSC-FDM-TS0025 - DB_ID_UDF MAY HAVE A DIFFERENT BEHAVIOR IN CERTAIN CASES ***/;
Résultat¶
6
Meilleures pratiques¶
Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.
SSC-FDM-TS0026¶
Le cas DELETE n’est pas pris en compte dans la table temporaire.
Description¶
Il existe un modèle d’instruction INSERT qui nécessite une transformation spécifique, ce qui implique la création d’une table temporaire. Ce FDM notifie que le cas DELETE n’est pas pris en compte dans la transformation mentionnée. Veuillez consulter INSERT avec Table DML Factor avec MERGE as DML pour obtenir plus d’informations sur ce modèle.
Code d’entrée :¶
SQL Server¶
INSERT INTO T3
SELECT
col1,
col2
FROM (
MERGE T1 USING T2
ON T1.col1 = T2.col1
WHEN NOT MATCHED THEN
INSERT VALUES ( T2.col1, T2.col2 )
WHEN MATCHED THEN
UPDATE SET T1.col2 = t2.col2
OUTPUT
$action ACTION_OUT,
T2.col1,
T2.col2
) AS MERGE_OUT
WHERE ACTION_OUT='UPDATE';
Code généré :¶
Snowflake¶
--** SSC-FDM-TS0026 - DELETE CASE IS NOT BEING CONSIDERED, PLEASE CHECK IF THE ORIGINAL MERGE PERFORMS IT **
CREATE OR REPLACE TEMPORARY TABLE MERGE_OUT AS
SELECT
CASE
WHEN T1.$1 IS NULL
THEN 'INSERT'
ELSE 'UPDATE'
END ACTION_OUT,
T2.col1,
T2.col2
FROM
T2
LEFT JOIN
T1
ON T1.col1 = T2.col1;
MERGE INTO T1
USING T2
ON T1.col1 = T2.col1
WHEN NOT MATCHED THEN
INSERT VALUES (T2.col1, T2.col2)
WHEN MATCHED THEN
UPDATE SET
T1.col2 = t2.col2
!!!RESOLVE EWI!!! /*** SSC-EWI-0021 - OUTPUT CLAUSE NOT SUPPORTED IN SNOWFLAKE ***/!!!
OUTPUT
$action ACTION_OUT,
T2.col1,
T2.col2 ;
INSERT INTO T3
SELECT
col1,
col2
FROM
MERGE_OUT
WHERE
ACTION_OUT ='UPDATE';
Meilleures pratiques¶
Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.
SSC-FDM-TS0027¶
L’instruction SET ANSI_NULLS ON peut avoir un comportement différent dans Snowflake.
Description¶
Ce FDM notifie que l’instruction SET ANSI_NULLS ON peut se comporter différemment dans Snowflake. Pour plus d’informations sur cette instruction, consultez l’article ANSI_NULLS.
Code d’entrée¶
SET ANSI_NULLS ON;
Code généré¶
----** SSC-FDM-TS0027 - SET ANSI_NULLS ON STATEMENT MAY HAVE A DIFFERENT BEHAVIOR IN SNOWFLAKE **
--SET ANSI_NULLS ON
Meilleures pratiques¶
Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.
SSC-FDM-TS0028¶
Les paramètres de sortie doivent apparaître dans le même ordre que dans le code exécuté.
Description¶
Ce FDM notifie que les paramètres de sortie dans l’instruction SP_EXECUTESQL doivent apparaître dans le même ordre que dans la chaîne SQL à exécuter. Dans le cas contraire, les valeurs de sortie ne seront pas correctement attribuées.
Exemple de code¶
Cas correct¶
Comme vous pouvez le voir, @MaxAgeOUT et @MaxIdOUT apparaissent dans le même ordre dans la chaîne SQL et dans les paramètres de sortie.
Ainsi, lors de la conversion du code, le SELECT 1 $, 2 $ INTO :MAXAGE, :MAXID FROM TABLE(RESULT_SCAN(LAST_QUERY_ID()) attribuera les valeurs correctement.
Transact¶
CREATE PROCEDURE CORRECT_OUTPUT_PARAMS_ORDER
AS
BEGIN
DECLARE @MaxAge INT;
DECLARE @MaxId INT;
EXECUTE sp_executesql
N'SELECT @MaxAgeOUT = max(AGE), @MaxIdOut = max(ID) FROM PERSONS WHERE ID < @id AND AGE < @age;',
N'@age INT, @id INT, @MaxAgeOUT INT OUTPUT, @MaxIdOUT INT OUTPUT',
30,
100,
@MaxAgeOUT = @MaxAge OUTPUT,
@MaxIdOut = @MaxId OUTPUT;
SELECT @MaxAge, @MaxId;
END
Snowflake¶
CREATE OR REPLACE PROCEDURE CORRECT_OUTPUT_PARAMS_ORDER ()
RETURNS TABLE()
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "transact", "convertedOn": "10/07/2024" }}'
EXECUTE AS CALLER
AS
$$
DECLARE
MAXAGE INT;
MAXID INT;
ProcedureResultSet RESULTSET;
BEGIN
!!!RESOLVE EWI!!! /*** SSC-EWI-0030 - THE STATEMENT BELOW HAS USAGES OF DYNAMIC SQL. ***/!!!
EXECUTE IMMEDIATE TRANSFORM_SP_EXECUTE_SQL_STRING_UDF('SELECT
MAX(AGE),
MAX(ID) FROM
PERSONS
WHERE
ID < @id AND AGE < @age;', '@age INT, @id INT, @MaxAgeOUT INT OUTPUT, @MaxIdOUT INT OUTPUT', ARRAY_CONSTRUCT('', '', 'MAXAGEOUT', 'MAXIDOUT'), ARRAY_CONSTRUCT(
30,
100, :MAXAGE, :MAXID));
--** SSC-FDM-TS0028 - OUTPUT PARAMETERS MUST HAVE THE SAME ORDER AS THEY APPEAR IN THE EXECUTED CODE **
SELECT
$1,
$2
INTO
:MAXAGE,
:MAXID
FROM
TABLE(RESULT_SCAN(LAST_QUERY_ID()));
ProcedureResultSet := (
SELECT
:MAXAGE,
:MAXID);
RETURN TABLE(ProcedureResultSet);
END;
$$;
Cas problématique¶
Comme vous pouvez le voir, @MaxAgeOUT et @MaxIdOUT dans les paramètres de sortie apparaissent dans un ordre différent comparé à la chaîne SQL.
Ainsi, lors de la conversion du code, le SELECT 1 $, 2 $ INTO :MAXID, :MAXAGE FROM TABLE(RESULT_SCAN(LAST_QUERY_ID()) attribuera les valeurs de manière incorrecte. Max(AGE) sera attribué à :MAXID et Max(ID) à :MAXAGE.
Cela doit être résolu manuellement en modifiant l’ordre des paramètres de sortie dans l’instruction SELECT INTO ou en modifiant l’ordre dans la chaîne SQL.
Transact¶
CREATE PROCEDURE INCORRECT_OUTPUT_PARAMS_ORDER
AS
BEGIN
DECLARE @MaxAge INT;
DECLARE @MaxId INT;
EXECUTE sp_executesql
N'SELECT @MaxAgeOUT = max(AGE), @MaxIdOut = max(ID) FROM PERSONS WHERE ID < @id AND AGE < @age;',
N'@age INT, @id INT, @MaxAgeOUT INT OUTPUT, @MaxIdOUT INT OUTPUT',
30,
100,
@MaxIdOut = @MaxId OUTPUT,
@MaxAgeOUT = @MaxAge OUTPUT;
SELECT @MaxAge, @MaxId;
END
Snowflake¶
CREATE OR REPLACE PROCEDURE INCORRECT_OUTPUT_PARAMS_ORDER ()
RETURNS TABLE()
LANGUAGE SQL
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "transact", "convertedOn": "10/07/2024" }}'
EXECUTE AS CALLER
AS
$$
DECLARE
MAXAGE INT;
MAXID INT;
ProcedureResultSet RESULTSET;
BEGIN
!!!RESOLVE EWI!!! /*** SSC-EWI-0030 - THE STATEMENT BELOW HAS USAGES OF DYNAMIC SQL. ***/!!!
EXECUTE IMMEDIATE TRANSFORM_SP_EXECUTE_SQL_STRING_UDF('SELECT
MAX(AGE),
MAX(ID) FROM
PERSONS
WHERE
ID < @id AND AGE < @age;', '@age INT, @id INT, @MaxAgeOUT INT OUTPUT, @MaxIdOUT INT OUTPUT', ARRAY_CONSTRUCT('', '', 'MAXIDOUT', 'MAXAGEOUT'), ARRAY_CONSTRUCT(
30,
100, :MAXID, :MAXAGE));
--** SSC-FDM-TS0028 - OUTPUT PARAMETERS MUST HAVE THE SAME ORDER AS THEY APPEAR IN THE EXECUTED CODE **
SELECT
$1,
$2
INTO
:MAXID,
:MAXAGE
FROM
TABLE(RESULT_SCAN(LAST_QUERY_ID()));
ProcedureResultSet := (
SELECT
:MAXAGE,
:MAXID);
RETURN TABLE(ProcedureResultSet);
END;
$$;
Meilleures pratiques¶
Assurez-vous que les paramètres OUTPUT apparaissent dans le même ordre que dans la chaîne SQL.
Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.
SSC-FDM-TS0029¶
L’instruction SET NOCOUNT est commentée, ce qui n’est pas applicable dans Snowflake.
Description¶
Lorsque SnowConvert AI rencontre une instruction SET NOCOUNT, il ajoute cette FDM. SnowConvert AI commente ensuite l’instruction SET NOCOUNT, car elle n’est pas pertinente dans l’environnement Snowflake.
Exemple de code¶
Code d’entrée :¶
SET NOCOUNT ON;
Code généré¶
----** SSC-FDM-TS0029 - SET NOCOUNT STATEMENT IS COMMENTED OUT, WHICH IS NOT APPLICABLE IN SNOWFLAKE. **
--SET NOCOUNT ON
Meilleures pratiques¶
Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.
SSC-FDM-TS0030¶
L’instruction SET ANSI_PADDING ON est commentée, ce qui est équivalent dans Snowflake.
Description¶
Snowflake préserve toujours les espaces de fin dans les valeurs de chaîne lorsqu’elles sont insérées dans des colonnes. Ce comportement est équivalent à SET ANSI_PADDING ON dans SQL Server. Par conséquent, lorsque SnowConvert AI rencontre une instruction SET ANSI_PADDING ON, il ajoute ce FDM et le commente.
Exemple de code¶
Code d’entrée :¶
SET ANSI_PADDING ON;
Code généré¶
----** SSC-FDM-TS0030 - SET ANSI_PADDING ON STATEMENT IS COMMENTED OUT, WHICH IS EQUIVALENT IN SNOWFLAKE. **
--SET ANSI_PADDING ON
Meilleures pratiques¶
Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.
SSC-FDM-TS0031¶
L’instruction SET ANSI_WARNINGS ON est commentée, ce qui correspond généralement au comportement ANSI standard adopté par Snowflake.
Description¶
Snowflake se comporte généralement comme si ANSI_WARNINGS était sur ON par défaut, en particulier en ce qui concerne la gestion des erreurs pour le débordement arithmétique, la division par zéro et la troncation de chaîne. Il n’est généralement pas nécessaire de « définir » explicitement un équivalent à ANSI_WARNINGS dans Snowflake. Par conséquent, lorsque SnowConvert AI rencontre une instruction SET ANSI_WARNINGS ON, il ajoute ce FDM et le commente.
Exemple de code¶
Code d’entrée :¶
SET ANSI_WARNINGS ON;
Code généré¶
----** SSC-FDM-TS0031 - SET ANSI_WARNINGS ON STATEMENT IS COMMENTED OUT, WHICH SNOWFLAKE GENERALLY ADHERES TO ANSI-STANDARD BEHAVIORS. **
--SET ANSI_WARNINGS ON
Meilleures pratiques¶
Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.
SSC-FDM-TS0032¶
La propriété de colonne IDENTITY n’est pas prise en charge dans l’STATEMENT CREATE TABLE AS, émulée à l’aide de ROW_NUMBER().
Description¶
Snowflake ne possède pas de moyen direct d’effectuer CREATE TABLE AS avec une colonne d’identité. Pour autant, SnowConvert ajoute une colonne ROW_NUMBER à la place de IDENTITY pour simuler l’énumération de l’identité. Cette transformation ne crée pas de colonne d’identité, ce qui signifie que les lignes insérées après la création ne seront pas automatiquement incrémentées.
Exemple de code¶
Code d’entrée :¶
with peers as
(
select
*
from (
values
('Luis', 'Miguel'),
('Cory', 'Wong'),
('Steve', 'Vai'),
('John', 'Petrucci'),
('Paul', 'Gilbert')
) as info(name, lastname)
)
select
rowm = IDENTITY(int,1,1),
*
into #MYTABLE
from peers;
Code généré¶
--** SSC-FDM-TS0032 - IDENTITY COLUMN PROPERTY NOT SUPPORTED IN CREATE TABLE AS STATEMENT, EMULATED WITH USING ROW_NUMBER **
CREATE OR REPLACE TEMPORARY TABLE T_MYTABLE AS
WITH peers as
(
select
*
from (
values
('Luis', 'Miguel'),
('Cory', 'Wong'),
('Steve', 'Vai'),
('John', 'Petrucci'),
('Paul', 'Gilbert')
) as info (
name,
lastname
)
)
SELECT
ROW_NUMBER()
OVER (
ORDER BY
NULL) AS rowm,
*
from
peers;
Meilleures pratiques¶
Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.
SSC-FDM-TS0033¶
SET QUOTED_IDENTIFIER STATEMENT MAY HAVE A DIFFERENT BEHAVIOR IN SNOWFLAKE.
Description¶
SQL Server Behavior
In SQL Server, SET QUOTED_IDENTIFIER ON is a syntax setting that is separate from collation. The database’s or column’s collation (e.g., _CI for Case-Insensitive or _CS for Case-Sensitive) dictates whether quoted identifiers are case-sensitive or not. If a database has a _CI collation, then « MyColumn » and « mycolumn » are treated as the same.
Snowflake Behavior
In Snowflake, the behavior is simpler and more strict:
Unquoted Identifiers: Automatically stored and resolved in all uppercase, making them case-insensitive (mytable is the same as MYTABLE).
Quoted Identifiers: By default, identifiers enclosed in double quotes (« MyColumn ») are case-sensitive. They are stored exactly as you typed them.
Exemple de code¶
Code d’entrée :¶
SET QUOTED_IDENTIFIER ON
GO
-- the table is defined as "Products Test"
-- this query will work because the case is ignored.
select
*
from [products test];
SET QUOTED_IDENTIFIER OFF
-- this query will fail because the case is preserved
select
*
from [products test];
GO
Code généré¶
----** SSC-FDM-TS0033 - SET QUOTED_IDENTIFIER STATEMENT MAY HAVE A DIFFERENT BEHAVIOR IN SNOWFLAKE **
--SET QUOTED_IDENTIFIER ON
-- the table is defined as "Products Test"
-- this query will work because the case is ignored.
select
*
from
"products test";
----** SSC-FDM-TS0033 - SET QUOTED_IDENTIFIER STATEMENT MAY HAVE A DIFFERENT BEHAVIOR IN SNOWFLAKE **
--SET QUOTED_IDENTIFIER OFF
-- this query will fail because the case is preserved
select
*
from
"products test";
How to Achieve Equivalence in Snowflake
To get the same case-insensitive behavior for quoted identifiers as in SQL Server, you can set the QUOTED_IDENTIFIERS_IGNORE_CASE session parameter to TRUE in Snowflake.
-- This will make quoted identifiers case-insensitive for the session
ALTER SESSION SET QUOTED_IDENTIFIERS_IGNORE_CASE = TRUE;
-- Now, this query will succeed
select
*
from
"products test";
Meilleures pratiques¶
Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.
SSC-FDM-TS0034¶
Description¶
This FDM is generated when a DATA_COMPRESSION clause is encountered in a CREATE TABLE or ALTER TABLE statement. In SQL Server, DATA_COMPRESSION is used to specify whether data should be compressed (using ROW or PAGE compression) to reduce storage space and improve I/O performance. Snowflake automatically handles data compression using its proprietary compression algorithms, making the DATA_COMPRESSION clause unnecessary and unsupported. SnowConvert comments out the DATA_COMPRESSION clause during conversion.
Example Code¶
Input (SQL Server):¶
CREATE TABLE Employees (
EmployeeID INT PRIMARY KEY,
Name NVARCHAR(100),
Department NVARCHAR(50),
Salary DECIMAL(10, 2)
)
WITH (DATA_COMPRESSION = PAGE);
Output (Snowflake):¶
CREATE OR REPLACE TABLE Employees (
EmployeeID INT PRIMARY KEY,
Name NVARCHAR(100),
Department NVARCHAR(50),
Salary DECIMAL(10, 2)
)
WITH (
-- --** SSC-FDM-TS0034 - DATA_COMPRESSION IS AUTOMATICALLY HANDLED BY SNOWFLAKE. **
-- DATA_COMPRESSION = PAGE
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "transact", "convertedOn": "11/06/2025", "domain": "no-domain-provided", "migrationid": "sFmaAZAnCnm6VvGeJrE4BQ==" }}'
;
Si vous avez besoin de plus d’assistance, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.