SnowConvert: Transact-SQL-Funktionsunterschiede¶
Supported Environments
[x] Microsoft SQL Server
[x] Microsoft Azure Synapse Analytics
SSC-FDM-TS0001¶
Bemerkung
Diese FDM ist veraltet. Weitere Informationen finden Sie unter SSC-EWI-TS0077.
Beschreibung¶
Dieser Fehler tritt auf, wenn Sie versuchen, eine Sortierklausel zu verwenden, die Snowflake nicht unterstützt.
Codebeispiel¶
Eingabecode:¶
SELECT 'a' COLLATE Albanian_BIN;
SELECT 'a' COLLATE Albanian_CI_AI;
CREATE TABLE ExampleTable (
ID INT,
Name VARCHAR(50) COLLATE collateName
);
Generierter Code:¶
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"}}'
;
Best Practices¶
Sie müssen nichts unternehmen.
Wenn Sie zusätzliche Unterstützung benötigen, kontaktieren Sie uns bitte unter snowconvert-support@snowflake.com
SSC-FDM-TS0002¶
Beschreibung¶
Dieser Fehler tritt auf, wenn Sie eine Sortierungsklausel verwenden, die Snowflake nicht unterstützt.
Codebeispiel¶
Eingabecode:¶
SELECT 'a' COLLATE Latin1_General_CI_AS_WS;
Generierter Code:¶
SELECT 'a' COLLATE 'EN-CI-AS' /*** SSC-FDM-TS0002 - COLLATION FOR VALUE WS NOT SUPPORTED ***/;
Best Practices¶
Sie müssen nichts unternehmen.
Wenn Sie zusätzliche Unterstützung benötigen, kontaktieren Sie uns bitte unter snowconvert-support@snowflake.com
SSC-FDM-TS0003¶
Beschreibung¶
Diese Meldung erscheint, wenn Sie die XP_LOGININFO-Prozedur ausführen, die eine bestimmte Gruppe von Spalten zurückgibt. Weitere Einzelheiten zu diesen Spalten finden Sie in der Dokumentation zu SQL Server.
account name | type | privilege | mapped login name | permission path |
Um die verfügbaren Rollen zu verstehen, können Sie in Snowflake die Ansicht APPLICABLE_ROLES abfragen. Diese Ansicht enthält eine Reihe von Spalten mit Rolleninformationen. Weitere Einzelheiten entnehmen Sie bitte der Snowflake-Dokumentation.
GRANTEE |
ROLE_NAME |
ROLE_OWNER |
IS_GRANTABLE |
---|
Die Zuordnung von SQL Server-Quellspalten zu Snowflake-Spalten ist in der folgenden Tabelle dargestellt. Bitte beachten Sie, dass diese Zuordnungen möglicherweise nicht genau gleichwertig sind.
SQL Server | SnowFlake | |
---|---|---|
account name | GRANTEE | |
type | ROLE_OWNER | |
privilege | ROLE_NAME | |
mapped login name | GRANTEE | |
permission path | NULL |
Beispielcode¶
Eingabecode:¶
EXEC xp_logininfo
EXEC xp_logininfo 'USERNAME'
Generierter Code:¶
--** 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'));
Best Practices¶
Wenn Sie zusätzliche Unterstützung benötigen, kontaktieren Sie uns bitte unter snowconvert-support@snowflake.com
SSC-FDM-TS0004¶
Beschreibung¶
Diese Meldung erscheint, wenn eine BULK INSERT
-Operation konvertiert wurde und ein PUT
-Befehl im Ausgabecode enthalten ist. Da der PUT
-Befehl nicht über das die SnowSQL-Web-UI ausgeführt werden kann, müssen Benutzer die Snowflake-Befehlszeilenschnittstelle (SnowCLI) auf ihrem System installiert haben, bevor sie diesen Befehl ausführen.
Codebeispiel¶
Eingabecode:¶
BULK INSERT #temptable FROM 'path/to/file.txt'
WITH
(
FIELDTERMINATOR ='\t',
ROWTERMINATOR ='\n'
);
Generierter Code:¶
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;
Best Practices¶
Installieren Sie die Snowflake-Befehlszeilenschnittstelle (SnowCLI).
Wenn Sie zusätzliche Unterstützung benötigen, kontaktieren Sie uns bitte unter snowconvert-support@snowflake.com
SSC-FDM-TS0005¶
Beschreibung¶
Dieses Featuremigrationsdetail (FMD) wird hinzugefügt, wenn eine TRY_CONVERT- oder TRY_CAST-Operation aus der Quelldatenbank nicht direkt in eine TRY_CAST-Funktion in Snowflake konvertiert werden kann.
Die Snowflake-Funktion TRY_CAST ist darauf beschränkt, nur Zeichenfolgenausdrücke zu konvertieren, während die Funktionen TRY_CONVERT
und TRY_CAST
von SQL Server flexibler sind und Ausdrücke jedes Datentyps konvertieren können.
Die Konvertierung in die Snowflake-Funktion TRY_CAST
ist derzeit auf Zeichenfolgenausdrücke oder Ausdrücke beschränkt, die aufgrund ihres Kontexts als Zeichenfolgen identifiziert werden können.
Codebeispiel¶
Eingabecode:¶
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 )');
Generierter Code:¶
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 )');
Best Practices¶
Sie müssen nichts unternehmen.
Wenn Sie zusätzliche Unterstützung benötigen, kontaktieren Sie uns bitte unter snowconvert-support@snowflake.com
SSC-FDM-TS0006¶
Beschreibung¶
Diese Meldung erscheint, wenn SnowConvert eine Prozedur entdeckt, die eine EXECUTE AS 'user_name'
-Klausel enthält. Da Snowflake dieses Feature nicht unterstützt, wird es automatisch in EXECUTE AS CALLER
konvertiert.
Dieser Parameter definiert die Sicherheitsberechtigungen, die die Ausführung der Prozedur steuern.
Bemerkung
Weitere Informationen über die Funktionalität der Klausel finden Sie in der Dokumentation.
Codebeispiel¶
Eingabecode:¶
CREATE PROCEDURE SelectAllCustomers
WITH EXECUTE AS 'user_name'
AS
BEGIN
SELECT * FROM Customers;
END;
Generierter Code:¶
--** 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;
$$;
Best Practices¶
Sie müssen nichts unternehmen.
Wenn Sie zusätzliche Unterstützung benötigen, kontaktieren Sie uns bitte unter snowconvert-support@snowflake.com
SSC-FDM-TS0007¶
Beschreibung¶
Diese Meldung erscheint, wenn SnowConvert eine Prozedur erkennt, die eine FOR REPLICATION
-Klausel enthält. Da Snowflake dieses Feature nicht unterstützt, wird die Klausel bei der Konvertierung automatisch entfernt.
Dieses Verfahren ist speziell für Replikationszwecke gedacht und kann nicht auf der Abonnentenseite ausgeführt werden.
Bemerkung
Weitere Informationen zur Funktionalität dieser Klausel finden Sie in der Dokumentation.
Codebeispiel¶
Eingabecode:¶
CREATE PROCEDURE SelectAllCustomers
WITH FOR REPLICATION
AS
BEGIN
SELECT * FROM Customers;
END;
Generierter Code:¶
--** 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;
$$;
Best Practices¶
Sie müssen nichts unternehmen.
Wenn Sie zusätzliche Unterstützung benötigen, kontaktieren Sie uns bitte unter snowconvert-support@snowflake.com
SSC-FDM-TS0008¶
Beschreibung¶
Eine Warnung erscheint, wenn die Funktion FORMATMESSAGE
erkannt wird, weil sie durch FORMATMESSAGE_UDF
ersetzt wurde. Bitte beachten Sie, dass FORMATMESSAGE_UDF
möglicherweise nicht alle Formattypen korrekt verarbeitet und in bestimmten Situationen Fehler erzeugen kann.
Negative numerische Werte behalten ihr negatives Vorzeichen und werden nicht konvertiert. Die Formatspezifikation %I64d
ist nicht mit UDFs kompatibel und führt zu einem Fehler, wenn sie verwendet wird.
In der FORMATMESSAGE_UDF-Funktion tritt ein Fehler auf, wenn die Anzahl der angegebenen Argumente nicht mit der Anzahl der Platzhalter in der Meldungsvorlage übereinstimmt.
Diese benutzerdefinierte Funktion (UDF) kann keine Meldungsnummerbezeichner verarbeiten.
Codebeispiel¶
Eingabecode:¶
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)
Generierter Code:¶
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)
Best Practices¶
Verwenden Sie in Meldungen nicht den Platzhalter
%I64d
.Verwenden Sie eine direkte Zeichenfolgenmeldung anstelle einer Meldungs-ID als erstes Argument.
Stellen Sie sicher, dass die Anzahl der Platzhalter mit der Anzahl der Argumente übereinstimmt, die der Meldung folgen.
Wenn Sie weitere Hilfe benötigen, kontaktieren Sie uns unter snowconvert-support@snowflake.com
SSC-FDM-TS0009¶
Beschreibung¶
Diese Warnung erscheint, wenn eine Spalte mit der Option ENCRYPTED WITH
definiert wurde. Da Snowflake keine Verschlüsselung auf Spaltenebene unterstützt, wird diese Option während des Konvertierungsprozesses entfernt und eine Warnmeldung ausgegeben.
Codebeispiel¶
Eingabecode:¶
CREATE TABLE [SCHEMA1].[TABLE1] (
[COL1] NVARCHAR(60)
ENCRYPTED WITH (
COLUMN_ENCRYPTION_KEY = MyCEK,
ENCRYPTION_TYPE = RANDOMIZED,
ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256'
)
);
Generierter Code:¶
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"}}'
;
Best Practices¶
Sie müssen nichts unternehmen.
Wenn Sie zusätzliche Unterstützung benötigen, kontaktieren Sie uns bitte unter snowconvert-support@snowflake.com
SSC-FDM-TS0010¶
Beschreibung¶
Diese Warnung erscheint, wenn die SQL Server-Funktion DB_NAME in die Funktion CURRENT_DATABASE von Snowflake konvertiert wird. Da die Snowflake-Funktion CURRENT_DATABASE keine Datenbank-IDs als Parameter unterstützt und nur den Namen der aktuellen Datenbank zurückgibt, kann diese Konvertierung das Verhalten Ihres Codes beeinflussen.
Codebeispiel¶
Eingabecode:¶
SELECT DB_NAME(someId);
Generierter Code:¶
SELECT
CURRENT_DATABASE() /*** SSC-FDM-TS0010 - CURRENT_DATABASE function has different behavior in certain cases ***/;
Best Practices¶
Sie müssen nichts unternehmen.
Wenn Sie zusätzliche Unterstützung benötigen, kontaktieren Sie uns bitte unter snowconvert-support@snowflake.com
SSC-FDM-TS0011¶
Bemerkung
Diese FDM wird nicht mehr unterstützt. Weitere Informationen finden Sie unter SSC-EWI-TS0078.
Beschreibung¶
Dieser Fehler tritt auf, wenn Ausdrücke wie Funktionsaufrufe, Variablennamen oder benannte Konstanten nach dem Standardfall in einer SWITCH-Anweisung platziert werden.
Snowflake akzeptiert nur explizite konstante Werte, wie Zahlen oder Zeichenfolgen, als direkte Eingaben.
Codebeispiel¶
Eingabecode:¶
ALTER TABLE
T_ALTERTABLETEST
ADD
COLUMN COL10 INTEGER DEFAULT RANDOM(10);
Generierter Code:¶
--** 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)
;
#### Best Practices¶
Wenn Sie zusätzliche Unterstützung benötigen, kontaktieren Sie uns bitte unter snowconvert-support@snowflake.com
SSC-FDM-TS0012¶
Beschreibung¶
Diese Warnung erscheint in benutzerdefinierten Tabellenwertfunktionen, wenn das System bei der Konvertierung den Rückgabetyp einer Spalte nicht bestimmen kann. In diesen Fällen wird STRING
automatisch als Standardtyp verwendet, um der CAST
-Operation in der SELECT
-Anweisung zu entsprechen.
Codebeispiel¶
Eingabecode:¶
CREATE FUNCTION GetDepartmentInfo()
RETURNS TABLE
AS
RETURN
(
SELECT DepartmentID, Name, GroupName
FROM HumanResources.Department
);
Generierter Code:¶
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
$$;
Best Practices¶
Prüfen Sie den Datentyp, der nicht gefunden werden konnte, und aktualisieren Sie ihn in der
RETURNS TABLE
-Anweisung.Wenn Sie weitere Hilfe benötigen, kontaktieren Sie uns unter snowconvert-support@snowflake.com
SSC-FDM-TS0013¶
Beschreibung¶
Diese Warnung erscheint, wenn der Quellcode Cursor enthält, die geändert werden können. In Snowflake Scripting sind die Cursorzeilen schreibgeschützt und können nicht geändert werden.
Beispielcode:¶
Eingabecode:¶
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;
Generierter Code:¶
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;
$$;
Best Practices¶
Wenn Sie zusätzliche Unterstützung benötigen, kontaktieren Sie uns bitte unter snowconvert-support@snowflake.com
SSC-FDM-TS0014¶
Beschreibung¶
Beim Konvertieren einer berechneten SQL Server-Spalte in Snowflake wird eine Warnung angezeigt. Diese Warnung weist darauf hin, dass die Funktionalität in Snowflake möglicherweise nicht genau dieselbe ist wie in SQL Server.
Codebeispiel¶
Eingabecode:¶
CREATE TABLE [TestTable](
[Col1] AS (CONVERT ([REAL], ExpressionValue))
);
Generierter Code:¶
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"}}'
;
Best Practices¶
Diese Meldung ist nur zu Ihrer Information. Es besteht kein Handlungsbedarf.
Nehmen Sie manuelle Anpassungen an allen Ausdrücken vor, die nicht automatisch transformiert wurden.
Wenn Sie weitere Hilfe benötigen, kontaktieren Sie uns bitte unter snowconvert-support@snowflake.com
SSC-FDM-TS0015¶
Beschreibung¶
Diese Warnung erscheint, wenn der Datentyp einer SQL Server-Spalte in Snowflake nicht unterstützt wird.
Codebeispiel¶
Eingabecode:¶
CREATE TABLE table1
(
column1 type1
);
Generierter Code:¶
CREATE OR REPLACE TABLE table1
(
column1 VARIANT /*** SSC-FDM-TS0015 - DATA TYPE TYPE1 IS NOT SUPPORTED IN SNOWFLAKE ***/
)
COMMENT = '{"origin":"sf_sc","name":"snowconvert","version":{"major":1, "minor":0},"attributes":{"component":"transact"}}'
;
Best Practices¶
Lesen Sie die Dokumentation zu den Snowflake-Datentypen, um einen passenden Datentyp für Ihre Bedürfnisse zu finden.
Wenn Sie weitere Hilfe benötigen, kontaktieren Sie uns bitte unter snowconvert-support@snowflake.com
SSC-FDM-TS0016¶
Beschreibung¶
Diese Warnung erscheint bei der Konvertierung einer SQL Server -FOR XML-Klausel in Snowflake. Sie zeigt an, dass die Spaltenreihenfolge in der resultierenden XML-Ausgabe auf den beiden Plattformen unterschiedlich sein kann.
Codebeispiel¶
Geben Sie eine Beispieltabelle mit dem Namen employee
wie unten gezeigt an.
ID |
Name |
Hinweis |
---|---|---|
1 |
Kinslee Park |
Entwickler |
2 |
Ezra Mata |
Entwickler |
3 |
Aliana Quinn |
Manager |
Eingabecode:¶
SELECT
e.id,
e.name as full_name,
e.hint
FROM
employee e
FOR XML PATH;
<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>
Generierter 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;
<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>
Best Practices¶
Dies ist eine Informationsmeldung. Es sind keine Maßnahmen erforderlich.
Wenn Sie zusätzliche Unterstützung benötigen, kontaktieren Sie uns bitte unter snowconvert-support@snowflake.com
SSC-FDM-TS0017¶
Beschreibung¶
Diese Warnung erscheint, wenn Funktionen wie SUSER_NAME
oder SUSER_SNAME
einen Parameter für einen Benutzerbezeichner enthalten, da die Funktion CURRENT_USER von Snowflake keine Benutzerparameter unterstützt.
Eingabecode:¶
SELECT SUSER_NAME(0x010500000000000515000000a065cf7e784b9b5fe77c87705a2e0000);
Generierter Code:¶
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. ***/;
Best Practices¶
Sie müssen nichts unternehmen.
Wenn Sie zusätzliche Unterstützung benötigen, kontaktieren Sie uns bitte unter snowconvert-support@snowflake.com
SSC-FDM-TS0018¶
Bemerkung
Diese FDM wird nicht mehr unterstützt. Weitere Informationen finden Sie unter SSC-EWI-TS0079.
Beschreibung¶
Dieses Featuremigrationsdetail (FMD) erscheint, wenn SnowConvert eine DBCC-Anweisung (Database Console Command) im Quellcode entdeckt. Bitte beachten Sie, dass Snowflake die meisten DBCC-Anweisungen nicht unterstützt.
Codebeispiel¶
Eingabecode:¶
DBCC CHECKIDENT(@a, RESEED, @b) WITH NO_INFOMSGS
Generierter Code:¶
----** SSC-FDM-TS0018 - DATABASE CONSOLE COMMAND 'CHECKIDENT' IS NOT SUPPORTED. **
--DBCC CHECKIDENT(@a, RESEED, @b) WITH NO_INFOMSGS
Empfehlungen¶
Dies ist eine Informationsmeldung. Es sind keine Maßnahmen erforderlich.
Wenn Sie zusätzliche Unterstützung benötigen, kontaktieren Sie uns bitte unter snowconvert-support@snowflake.com
SSC-FDM-TS0019¶
Schweregrad¶
Schlecht
Beschreibung¶
Diese Warnung weist darauf hin, dass die RAISERROR-Fehlermeldung aufgrund der Zeichenfolgen-Formatierungsregeln von SQL Server unterschiedlich ausfallen kann.
Codebeispiel¶
Eingabecode:¶
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
Generierter Code:¶
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;
$$;
Empfehlungen¶
Wenn Sie zusätzliche Unterstützung benötigen, kontaktieren Sie uns bitte unter snowconvert-support@snowflake.com
SSC-FDM-TS0020¶
Beschreibung¶
Dieser Featureerkennungsmarker (Feature Detection Marker, FDM) wird ausgelöst, wenn eine Standardeinschränkung in einer ALTER TABLE-Anweisung gefunden wird.
Derzeit wird dieser Typ von Einschränkung nicht unterstützt. Um diese Beschränkung zu umgehen, sollten Sie die Tabelle definieren, bevor Sie den ALTER TABLE-Befehl verwenden. Dieser Ansatz hilft SnowConvert dabei, die Referenzen zu identifizieren, und die Standardeinschränkung wird in die Tabellendefinition aufgenommen. Wenn Sie diesen Ansatz nicht verfolgen, wird die Einschränkung nur als Kommentar im Code erscheinen.
Codebeispiel¶
Eingabecode:¶
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;
Ausgabecode:¶
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
;
Bekannte Probleme¶
Wenn mehrere Standardeinschränkungen für dieselbe Spalte definiert sind, wird in der CREATE TABLE-Anweisung nur die erste angezeigt.
Wenn eine Standardeinschränkung eine Spalte referenziert, die nicht existiert, schlägt die Transformation fehl, weil die erforderliche Spalte fehlt.
Empfehlungen¶
Wenn Sie zusätzliche Unterstützung benötigen, kontaktieren Sie uns bitte unter snowconvert-support@snowflake.com
SSC-FDM-TS0021¶
Schweregrad¶
Schlecht
Bemerkung
Zur besseren Lesbarkeit haben wir einige Abschnitte des Codes in diesem Beispiel vereinfacht.
Beschreibung¶
Diese EWI-Meldung (Error, Warning, Information) erscheint, wenn eine ALTER TABLE-Anweisung eine MASKED WITH-Klausel enthält. Sie zeigt an, dass das System eine ungenaue MASKING POLICY erstellt hat, um die Funktion MASKED WITH zu ersetzen.
Codebeispiel¶
Eingabecode:¶
ALTER TABLE table_name
ALTER COLUMN column_name
ADD MASKED WITH (FUNCTION = 'default()');
Ausgabecode:¶
--** 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";
Bemerkung
Die MASKING POLICY muss erstellt werden, bevor Sie die ALTER TABLE-Anweisung ausführen. Bitte beachten Sie, dass das Verhalten möglicherweise nicht genau dem des Ausgangssystems entspricht und Sie möglicherweise Rollen und Berechtigungen der Benutzer entsprechend anpassen müssen.
Empfehlungen¶
Wenn Sie zusätzliche Unterstützung benötigen, kontaktieren Sie uns bitte unter snowconvert-support@snowflake.com
SSC-FDM-TS0022¶
Schweregrad¶
Schlecht
Bemerkung
Zur besseren Lesbarkeit haben wir einige Abschnitte des Codes in diesem Beispiel vereinfacht.
Beschreibung¶
Dieser Fehler tritt auf, wenn einer MASKING POLICY bestimmte Rollen oder Berechtigungen zugewiesen werden müssen, damit die Datenmaskierung korrekt funktioniert.
Codebeispiel¶
Eingabecode¶
ALTER TABLE tableName
ALTER COLUMN columnName
ADD MASKED WITH (FUNCTION = 'partial(1, "xxxxx", 1)');
Generierter Code:¶
--** 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";
Bemerkung
In Zeile 6 können Sie einen oder mehrere durch Kommas getrennte Rollenwerte hinzufügen. Jeder Rollenwert muss in einfache Anführungszeichen gesetzt werden.
Empfehlungen¶
Wenn Sie zusätzliche Unterstützung benötigen, kontaktieren Sie uns bitte unter snowconvert-support@snowflake.com
SSC-FDM-TS0023¶
Schweregrad¶
Schlecht
Beschreibung¶
Diese Warnung erscheint während der Transformation der Funktion ERROR_MESSAGE(). Bitte beachten Sie, dass die genaue Fehlermeldung in Snowflake anders aussehen kann.
Eingabecode:¶
SET @varErrorMessage = ERROR_MESSAGE()
Ausgabecode¶
BEGIN
VARERRORMESSAGE := SQLERRM /*** SSC-FDM-TS0023 - ERROR MESSAGE COULD BE DIFFERENT IN SNOWFLAKE ***/;
END;
Empfehlung¶
Wenn Sie weitere Hilfe benötigen, wenden Sie sich bitte an unser Support-Team unter snowconvert-support@snowflake.com.
SSC-FDM-TS0024¶
Beschreibung¶
Dieser Funktionserkennungsmechanismus (Function Detection Mechanism, FDM) wird ausgelöst, wenn At Time Zone
mit CURRENT_TIMESTAMP
verwendet wird. Diese Überprüfung ist notwendig, da die Ergebnisse in bestimmten Szenarien variieren können.
Der wichtigste Unterschied zwischen SQL Server und der Funktion CURRENT_TIMESTAMP von Snowflake ist die Handhabung der Zeitzonen:
SQL Server: Gibt das Systemdatum und die Systemuhrzeit basierend auf der lokalen Zeitzone des Servers zurück
Snowflake: Gibt das Datum und die Uhrzeit als UTC-Zeit (Koordinierte Weltzeit) zurück
Eingabecode:¶
SELECT current_timestamp at time zone 'Hawaiian Standard Time';
2024-02-08 16:52:55.317 -10:00
Ausgabecode:¶
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 ***/);
2024-02-08 06:53:46.994 -1000
Empfehlungen¶
Hier ist ein Beispiel dafür, wie Sie in Snowflake eine einheitliche Formatierung beibehalten können.
SELECT current_timestamp at time zone 'Hawaiian Standard Time';
2024-02-08 16:33:49.143 -10:00
In Snowflake können Sie die Standardzeitzone mit dem Befehl ALTER SESSION ändern. Beispiel:
ALTER SESSION SET TIMEZONE = 'Pacific/Honolulu';
SELECT
CONVERT_TIMEZONE('Pacific/Honolulu', 'UTC', CURRENT_TIMESTAMP());
2024-02-08 16:33:49.143
Wenn Sie zusätzliche Unterstützung benötigen, kontaktieren Sie uns bitte unter snowconvert-support@snowflake.com
SSC-FDM-TS0025¶
Beschreibung¶
Diese Funktionsdesignnotiz (Function Design Memo, FDM) erklärt, wie die Funktion DB_ID_UDF das Verhalten der SQL Server-Funktion DB_ID zu replizieren versucht. Während SQL Server den Datenbanken permanente, eindeutige Bezeichner zuweist, die nie wiederverwendet werden, geht Snowflake mit den Datenbank-IDs anders um. In Snowflake sind die Datenbank-IDs fortlaufende Nummern, die zum Zeitpunkt der Erstellung zugewiesen werden. Wenn eine Datenbank gelöscht wird, wird ihre ID-Nummer frei und wird der nächsten neu erstellten Datenbank zugewiesen.
Eingabecode:¶
SELECT DB_ID('my_database');
6
Ausgabecode:¶
SELECT
DB_ID_UDF('my_database') /*** SSC-FDM-TS0025 - DB_ID_UDF MAY HAVE A DIFFERENT BEHAVIOR IN CERTAIN CASES ***/;
6
Empfehlungen¶
Wenn Sie zusätzliche Unterstützung benötigen, kontaktieren Sie uns bitte unter snowconvert-support@snowflake.com
SSC-FDM-TS0026¶
Beschreibung¶
Wenn Sie eine INSERT-Anweisung transformieren, die einen DML-Tabellenfaktor enthält, muss eine temporäre Tabelle erstellt werden. Beachten Sie, dass diese Featureerkennungsmeldung (Feature Detection Message, FDM) angibt, dass DELETE-Operationen in dieser Transformation nicht enthalten sind. Weitere Einzelheiten zu diesem Muster finden Sie unter INSERT with Table DML Factor with MERGE as DML.
Eingabecode:¶
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';
Ausgabecode:¶
--** 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';
Empfehlungen¶
Wenn Sie zusätzliche Unterstützung benötigen, kontaktieren Sie uns bitte unter snowconvert-support@snowflake.com
SSC-FDM-TS0027¶
Beschreibung¶
Dieser Befund während der Migration (Finding During Migration, FDM) weist darauf hin, dass die SET ANSI_NULLS ON
-Anweisung in Snowflake anders funktionieren könnte als in der Quelldatenbank. Ausführliche Informationen zu dieser Anweisung finden Sie in der Dokumentation zu ANSI_NULLS.
Eingabecode¶
SET ANSI_NULLS ON;
Ausgabecode¶
----** SSC-FDM-TS0027 - SET ANSI_NULLS ON STATEMENT MAY HAVE A DIFFERENT BEHAVIOR IN SNOWFLAKE **
--SET ANSI_NULLS ON
Empfehlungen¶
Wenn Sie zusätzliche Unterstützung benötigen, kontaktieren Sie uns bitte unter snowconvert-support@snowflake.com
SSC-FDM-TS0028¶
Beschreibung¶
Diese Meldung weist darauf hin, dass bei der Verwendung von SP_EXECUTESQL die Ausgabeparameter in der gleichen Reihenfolge aufgeführt werden müssen, wie sie in der auszuführenden SQL-Zeichenfolge erscheinen. Wenn die Reihenfolge anders ist, werden die Ausgabewerte falsch zugeordnet.
Codebeispiel¶
Korrekter Fall¶
Die Reihenfolge der Parameter @MaxAgeOUT
und @MaxIdOUT
stimmt sowohl in der Abfragezeichenfolge SQL als auch in der Definition der Ausgabeparameter überein.
Bei der Konvertierung des Codes speichert die Anweisung SELECT $1, $2 INTO:MAXAGE, :MAXID FROM TABLE(RESULT_SCAN(LAST_QUERY_ID()))
die Werte aus den Spalten $1 und $2 in der Variablen MAXAGE bzw. MAXID.
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;
$$;
Allgemeine Probleme¶
Die Reihenfolge der Ausgabeparameter @MaxAgeOUT
und @MaxIdOUT
in der Definition der gespeicherten Prozedur unterscheidet sich von ihrer Reihenfolge in der SQL-Abfragezeichenfolge.
Dies hat zur Folge, dass bei der Codekonvertierung die Anweisung SELECT $1, $2 INTO :MAXID, :MAXAGE FROM TABLE(RESULT_SCAN(LAST_QUERY_ID()))
Werte in einer unerwarteten Reihenfolge zuweist. Der Wert von Max(AGE)
wird :MAXID
zugewiesen, während Max(ID)
zu :MAXAGE
zugewiesen wird, was das Gegenteil von dem ist, was beabsichtigt ist.
Dieses Problem kann behoben werden, indem Sie entweder die Reihenfolge der Ausgabeparameter in der SELECT INTO-Anweisung anpassen oder die Reihenfolge in der SQL-Zeichenfolge entsprechend ändern.
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;
$$;
Empfehlungen¶
Stellen Sie sicher, dass die OUTPUT-Parameter der Reihenfolge ihres Erscheinens in der SQL-Zeichenfolge entsprechen.
Wenn Sie weitere Hilfe benötigen, kontaktieren Sie uns unter snowconvert-support@snowflake.com