SnowConvert AI – Funktionsunterschiede zwischen SQL Server und Azure Synapse

Applies to
  • SQL Server

  • Azure Synapse Analytics

SSC-FDM-TS0001

Bemerkung

Diese FDM ist veraltet. Weitere Informationen finden Sie unter SSC-EWI-TS0077 documentation.

Beschreibung

Diese Meldung wird angezeigt, wenn es eine Sortierklausel gibt, die in Snowflake nicht unterstützt wird.

Codebeispiel

Eingabecode:
 SELECT 'a' COLLATE Albanian_BIN;

SELECT 'a' COLLATE Albanian_CI_AI;

CREATE TABLE ExampleTable (
    ID INT,
    Name VARCHAR(50) COLLATE collateName
);
Copy
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"}}'
;
Copy

Best Practices

  • Es sind keine zusätzlichen Benutzeraktionen erforderlich.

  • Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an snowconvert-support@snowflake.com senden.

SSC-FDM-TS0002

Beschreibung

Diese Meldung wird angezeigt, wenn es eine Sortierklausel gibt, die in Snowflake nicht unterstützt wird.

Codebeispiel

Eingabecode:
 SELECT 'a' COLLATE Latin1_General_CI_AS_WS;
Copy
Generierter Code:
 SELECT 'a' COLLATE 'EN-CI-AS' /*** SSC-FDM-TS0002 - COLLATION FOR VALUE WS NOT SUPPORTED ***/;
Copy

Best Practices

  • Es sind keine zusätzlichen Benutzeraktionen erforderlich.

  • Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an snowconvert-support@snowflake.com senden.

SSC-FDM-TS0003

XP_LOGININFO zugeordnet zu benutzerdefiniertem UDF

Beschreibung

Diese Meldung wird angezeigt, wenn die XP_LOGININFO-Prozedur ausgeführt wird und den folgenden Satz von Spalten zurückgibt (siehe SQL SERVER-Dokumentation für weitere Informationen).

account nametypeprivilegemapped login namepermission path

Um dieses Verhalten zu replizieren, kann eine Abfrage verwendet werden, die die Spalten aus der APPLICABLE_ROLES-Ansicht in Snowflake auswählt und den folgenden Satz von Spalten zurückgibt (siehe SnowFlake-Dokumentation für weitere Informationen).

GRANTEE

ROLE_NAME

ROLE_OWNER

IS_GRANTABLE

Ursprüngliche SQL Server-Spalten werden wie in der nächsten Tabelle gezeigt zugeordnet. Möglicherweise sind sie nicht vollständig gleichwertig.

SQL ServerSnowFlake
account nameGRANTEE
typeROLE_OWNER
privilegeROLE_NAME
mapped login nameGRANTEE
permission pathNULL

Beispielcode

Eingabecode:
 EXEC xp_logininfo

EXEC xp_logininfo 'USERNAME'
Copy
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'));
Copy

Best Practices

SSC-FDM-TS0004

Beschreibung

Diese Meldung wird angezeigt, wenn eine BULK INSERT-Anweisung umgewandelt wurde und ein PUT-Befehl zur Ausgabe hinzugefügt wurde. Dies geschieht, weil der PUT-Befehl nicht über die SnowSQL-Web-UI ausgeführt werden kann. Um ihn erfolgreich auszuführen, muss der Benutzer zuvor den SnowCLI installiert haben.

Codebeispiel

Eingabecode:
 BULK INSERT #temptable FROM 'path/to/file.txt'  
WITH
(
   FIELDTERMINATOR ='\t',  
   ROWTERMINATOR ='\n'
);
Copy
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;
Copy

Best Practices

SSC-FDM-TS0005

TRY_CONVERT/TRY_CAST konnte nicht konvertiert werden in TRY_CAST

Beschreibung

Diese FMD wird hinzugefügt, wenn TRY_CONVERT oder TRY_CAST in Snowflake nicht in TRY_CAST konvertiert werden können.

Die [TRY_CAST]-Funktion (https://docs.snowflake.com/en/sql-reference/functions/try_cast) von Snowflake hat eine Einschränkung, da sie nur die Konvertierung von Zeichenfolgenausdrücken erlaubt. Die TRY_CONVERT- und TRY_CAST-Funktionen hingegen unterstützen Ausdrücke beliebiger Datentypen.

Derzeit wird die Umwandlung von TRY_CONVERT oder TRY_CAST in die TRY_CAST-Funktion von Snowflake nur für Zeichenfolgenausdrücke oder für Ausdrücke durchgeführt, die das Tool im jeweiligen Kontext als Zeichenfolgen identifizieren kann.

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

Best Practices

  • Es sind keine zusätzlichen Benutzeraktionen erforderlich.

  • Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an snowconvert-support@snowflake.com senden.

SSC-FDM-TS0006

Die EXECUTE AS ‚user_name‘-Klausel existiert in Snowflake nicht, und der Benutzer, der die Prozedur aufruft, muss über alle erforderlichen Berechtigungen verfügen.

Beschreibung

Diese Nachricht wird angezeigt, wenn SnowConvert AI eine Prozedur mit einer EXECUTEAS „user_name“-Klausel findet. Dies wird in Snowflake nicht unterstützt, daher wird es in EXECUTE AS CALLER. geändert.

Diese Klausel gibt den Sicherheitskontext an, in dem die Prozedur ausgeführt werden soll.

Bemerkung

Weitere Informationen dazu finden Sie in der Dokumentation über die Funktion der Klausel.

Codebeispiel

Eingabecode:
 CREATE PROCEDURE SelectAllCustomers
WITH EXECUTE AS 'user_name'
AS
BEGIN
      SELECT * FROM Customers;
END;
Copy
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;
$$;
Copy

Best Practices

  • Es sind keine zusätzlichen Benutzeraktionen erforderlich.

  • Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an snowconvert-support@snowflake.com senden.

SSC-FDM-TS0007

FOR REPLICATION-Klausel existiert nicht in Snowflake.

Beschreibung

Diese Nachricht wird angezeigt, wenn SnowConvert AI eine Prozedur mit einer FORREPLICATION-Klausel findet. Dies wird in Snowflake nicht unterstützt, daher wird sie entfernt.

Diese Klausel gibt an, dass die Prozedur für die Replikation erstellt wird. Folglich kann es nicht auf dem Abonnent ausgeführt werden.

Bemerkung

Weitere Informationen dazu finden Sie in der Dokumentation zur Funktion der Klausel.

Codebeispiel

Eingabecode:
 CREATE PROCEDURE SelectAllCustomers
WITH FOR REPLICATION
AS
BEGIN
      SELECT * FROM Customers;
END;
Copy
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;
$$;
Copy

Best Practices

  • Es sind keine zusätzlichen Benutzeraktionen erforderlich.

  • Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an snowconvert-support@snowflake.com senden.

SSC-FDM-TS0008

FORMATMESSAGE-Funktion wurde konvertiert in UDF

Beschreibung

Diese Warnung wurde hinzugefügt, weil die Funktion FORMATMESSAGE verwendet wird und durch FORMATMESSAGE_UDF ersetzt wurde. Der Grund für das Hinzufügen dieser Warnung ist, dass die FORMATMESSAGE_UDF, die die ursprünglichen FORMATMESSAGE ersetzt, nicht alle Formatvarianten korrekt verarbeitet und unter bestimmten Bedingungen einen Fehler auslösen kann.

Numerische Werte ohne Vorzeichen, die als negativ angegeben werden, behalten das Vorzeichen bei, anstatt den Wert umzuwandeln. Außerdem wird der Platzhalter %I64d von UDF nicht unterstützt, sodass bei seiner Verwendung ein Fehler ausgelöst wird.

Bei Verwendung von FORMATMESSAGE_UDF tritt ein Fehler auf, wenn die angegebene Anzahl von Argumenten nicht mit der Anzahl der Platzhalter übereinstimmt.

Dieses UDF unterstützt nicht die Verwendung von Nachrichten-IDs.

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

Best Practices

  • Vermeiden Sie die Verwendung des Platzhalters %I64d in der Nachricht.

  • Verwenden Sie die Nachricht direkt als Zeichenfolge, anstatt eine Nachrichten-ID für das erste Argument zu verwenden.

  • Stellen Sie sicher, dass die Anzahl der Platzhalter mit der Anzahl der Argumente nach der Meldung übereinstimmt.

  • Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an snowconvert-support@snowflake.com senden.

SSC-FDM-TS0009

„Verschlüsselt mit“ wird in Snowflake nicht unterstützt.

Beschreibung

Diese Warnung wird hinzugefügt, wenn in einer Spaltendefinition ein ENCRYPTEDWITH-Attribut verwendet wird. Da dies in Snowflake nicht unterstützt wird, wird es entfernt und es wird eine Warnung hinzugefügt.

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

Best Practices

  • Es sind keine zusätzlichen Benutzeraktionen erforderlich.

  • Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an snowconvert-support@snowflake.com senden.

SSC-FDM-TS0010

CURRENT_DATABASE-Funktion verhält sich in bestimmten Fällen unterschiedlich.

Beschreibung

Diese EWI wird hinzugefügt, wenn die Funktion DB_NAME in CURRENT_DATABASE umgewandelt wird, da Snowflake den Parameter database_id nicht unterstützt und die Funktion CURRENT_DATABASE immer den Namen der aktuellen Datenbank zurückgibt.

Codebeispiel

Eingabecode:
 SELECT DB_NAME(someId);
Copy
Generierter Code:
 SELECT
CURRENT_DATABASE() /*** SSC-FDM-TS0010 - CURRENT_DATABASE function has different behavior in certain cases ***/;
Copy

Best Practices

  • Es sind keine zusätzlichen Benutzeraktionen erforderlich.

  • Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an snowconvert-support@snowflake.com senden.

SSC-FDM-TS0011

Standardwert in Snowflake nicht zulässig.

Bemerkung

Diese FDM ist veraltet. Weitere Informationen finden Sie unter SSC-EWI-TS0078.

Beschreibung

Dieser Fehler wird dem Code hinzugefügt, wenn Ausdrücke wie Funktionsaufrufe, Variablennamen oder benannte Konstanten auf die Standardoption folgen.

Snowflake unterstützt nur explizite Konstanten wie Zahlen oder Zeichenfolgen.

Codebeispiel

Eingabecode:
 ALTER TABLE
    T_ALTERTABLETEST
ADD
    COLUMN COL10 INTEGER DEFAULT RANDOM(10);
Copy
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)
                                           ;
Copy

Best Practices

SSC-FDM-TS0012

Informationen für die Spalte wurden nicht gefunden. STRING wird verwendet, um den CAST-Vorgang abzugleichen.

Beschreibung

Diese EWI wird in Table-Valued User-Defined Functions hinzugefügt, wenn der Rückgabetyp einer Spalte während der Konvertierung nicht bestimmt werden kann. STRING wird standardmäßig verwendet, um dem CAST-Vorgang in der SELECT-Anweisung zu entsprechen. <!–TODO: search for a broken reference.->

Codebeispiel

Eingabecode:
 CREATE FUNCTION GetDepartmentInfo()
RETURNS TABLE
AS
RETURN
(
  SELECT DepartmentID, Name, GroupName
  FROM HumanResources.Department
);
Copy
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
$$;
Copy

Best Practices

  • Der Benutzer sollte prüfen, welcher Datentyp nicht erkannt werden konnte, und ihn in der Statement-Definition RETURNS TABLEentsprechend anpassen.

  • Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an snowconvert-support@snowflake.com senden.

SSC-FDM-TS0013

Snowflake Scripting-Cursorzeilen sind nicht veränderbar.

Beschreibung

Diese EWI wird hinzugefügt, wenn Cursor für Änderungen im Eingabecode offen sind. Snowflake Scripting erlaubt es nicht, Cursorzeilen zu ändern.

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

Best Practices

SSC-FDM-TS0014

Berechnete Spalte transformiert

Beschreibung

Diese Warnung wird hinzugefügt, wenn eine berechnete Spalte aus SQL Server in ihr Snowflake-Äquivalent umgewandelt wird. Sie wurde hinzugefügt, weil in einigen Fällen die funktionale Äquivalenz beeinträchtigt werden könnte.

Codebeispiel

Eingabecode:
 CREATE TABLE [TestTable](
    [Col1] AS (CONVERT ([REAL], ExpressionValue))
);
Copy
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"}}'
;
Copy

Best Practices

  • Es sind keine zusätzlichen Benutzeraktionen erforderlich. Dies ist nur informativ.

  • Fügen Sie manuelle Änderungen an dem nicht transformierten Ausdruck hinzu.

  • Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an snowconvert-support@snowflake.com senden.

SSC-FDM-TS0016

XML-Spalten in Snowflake haben möglicherweise ein anderes Format

Beschreibung

Diese Warnung wird hinzugefügt, wenn eine SQL Server FOR XML-Klausel in ihr Snowflake-Äquivalent umgewandelt wird. Sie wird hinzugefügt, weil sich Spalten in XML unterscheiden können.

Codebeispiel

Angenommen, die folgende Tabelle hat den Namen: Mitarbeiter.

ID

Name

Hinweis

1

Kinslee Park

Entwickler

2

Ezra Mata

Entwickler

3

Aliana Quinn

Manager

Eingabecode:
Code
 SELECT
  	e.id,
  	e.name as full_name,
  	e.hint
  FROM
  	employee e
  FOR XML PATH;
Copy
Ausgabe
 <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>
Copy
Generierter Code:
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;
Copy
Ausgabe
 <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>
Copy

Best Practices

  • Es sind keine zusätzlichen Benutzeraktionen erforderlich. Dies ist nur informativ.

  • Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an snowconvert-support@snowflake.com senden.

SSC-FDM-TS0017

CURRENT_USER-Funktion unterstützt keine Benutzer-ID als Parameter.

Beschreibung

Diese EWI wird hinzugefügt, wenn Funktionen wie SUSER_NAME oder SUSER_SNAME den Benutzerbezeichner als Parameter enthalten, da dieser in der CURRENT_USER-Funktion von Snowflake nicht unterstützt wird.

Eingabecode:

 SELECT SUSER_NAME(0x010500000000000515000000a065cf7e784b9b5fe77c87705a2e0000);
Copy
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. ***/;
Copy

Best Practices

  • Es sind keine zusätzlichen Benutzeraktionen erforderlich.

  • Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an snowconvert-support@snowflake.com senden.

SSC-FDM-TS0018

Der Datenbank-Konsolenbefehl wird nicht unterstützt

Bemerkung

Diese FDM ist veraltet. Weitere Informationen finden Sie unter SSC-EWI-TS0079.

Beschreibung

Diese FMD wird hinzugefügt, wenn SnowConvert AI im Eingabecode eine DBCC-Anweisung findet. Die meisten DBCC-Anweisungen werden in Snowflake nicht unterstützt.

Codebeispiel

Eingabecode:
 DBCC CHECKIDENT(@a, RESEED, @b) WITH NO_INFOMSGS
Copy
Generierter Code:
 ----** SSC-FDM-TS0018 - DATABASE CONSOLE COMMAND 'CHECKIDENT' IS NOT SUPPORTED. **
--DBCC CHECKIDENT(@a, RESEED, @b) WITH NO_INFOMSGS
Copy

Best Practices

  • Es sind keine zusätzlichen Benutzeraktionen erforderlich. Dies ist nur informativ.

  • Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an snowconvert-support@snowflake.com senden.

SSC-FDM-TS0019

Die Fehlermeldung RAISERROR kann aufgrund des SQL-Zeichenfolgenformats abweichen.

Beschreibung

Diese EWI wird hinzugefügt, um darauf hinzuweisen, dass sich die Fehlermeldung RAISERROR aufgrund des SQL-Zeichenkettenformats unterscheiden 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
Copy
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;
$$;
Copy

Best Practices

SSC-FDM-TS0020

Die Standard-Einschränkung wurde auskommentarisiert und wurde möglicherweise zu einer Tabellendefinition hinzugefügt.

Beschreibung

Diese FDM wird hinzugefügt, wenn die Standardeinschränkung in einer Alter Table-Anweisung vorhanden ist.

Derzeit ist keine Unterstützung für diese Einschränkung verfügbar. Eine Problemumgehung für die Transformation besteht darin, die Tabelle vor der Verwendung von „Alter Table“ zu definieren. Dies erlaubt SnowConvert AI die Referenzen zu identifizieren. Die Standardeinschränkung wird in der Tabellendefinition konsolidiert. Andernfalls wird die Einschränkung nur auskommentiert.

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;
Copy
Generierter Code:
 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
                                                                              ;
Copy

Bekannte Probleme

  • Wenn für dieselbe Spalte verschiedene Standardeinschränkungen deklariert sind, wird in der Anweisung „Create Tabel“ nur die erste berücksichtigt.

  • Wenn eine Standardeinschränkung für eine fehlende Spalte deklariert wird, kann die Transformation aufgrund fehlender Abhängigkeiten nicht ausgeführt werden.

Best Practices

SSC-FDM-TS0021

Eine MASKING POLICY wurde als Ersatz für MASKED WITH erstellt.

Bemerkung

Einige Teile des Ausgabecodes werden aus Gründen der Übersichtlichkeit weggelassen.

Beschreibung

Diese EWI wird hinzugefügt, wenn die Alter Table-Anweisung eine MASKED WITH-Klausel enthält. Der Grund für diese Meldung ist, darauf hinzuweisen, dass eine approximative MASKING POLICY als Ersatz für die MASKED WITH-Funktion erstellt wurde.

Codebeispiel

Eingabecode:
 ALTER TABLE table_name
ALTER COLUMN column_name
ADD MASKED WITH (FUNCTION = 'default()');
Copy
Generierter Code:
 --** 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";
Copy

Bemerkung

Die MASKING POLICY wird vor der ALTER TABLE-Anweisung erstellt. Es wird erwartet, dass sie ein approximiertes Verhalten aufweist. Einige Anpassungen können in Bezug auf Rollen und Benutzerberechtigungen erforderlich sein.

Best Practices

SSC-FDM-TS0022

Der Benutzer muss zuvor die Maskierungsrolle definieren.

Bemerkung

Einige Teile des Ausgabecodes werden aus Gründen der Übersichtlichkeit weggelassen.

Beschreibung

Diese EWI wird angezeigt, wenn eine MASKING POLICY erstellt wird und eine Rolle oder Berechtigung mit ihr verknüpft werden muss, damit die Datenmaskierung ordnungsgemäß funktioniert.

Codebeispiel

Eingabecode
 ALTER TABLE tableName
ALTER COLUMN columnName
ADD MASKED WITH (FUNCTION = 'partial(1, "xxxxx", 1)');
Copy
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";
Copy

Bemerkung

Wie in Zeile 6 gezeigt, gibt es einen Platzhalter, in dem die definierten Rollen platziert werden können. Es gibt Platz für einen oder mehrere durch Kommas getrennte Werte. Auch hier ist die Verwendung einzelner Abfragen für jeden der Werte obligatorisch.

Best Practices

SSC-FDM-TS0023

Die Fehlerfunktion kann in Snowflake unterschiedlich sein

Beschreibung

Diese EWI wird bei der Transformation der folgenden ERRORs-Funktionen aufgrund der entsprechenden Verhaltensänderung hinzugefügt.

  • ERROR_MESSAGE Die Meldung von SQLERRM könnte in Snowflake anders sein.

  • ERROR_STATE Die Zieleigenschaft SQLSTATE kann aufgrund von Plattformunterschieden eine andere Zahl zurückgeben.

  • ERROR_PROCEDURE Die Transformation wurde geändert, um die gespeicherte Prozedur zurückzugeben, in der die Funktion aufgerufen wird.

Eingabecode:

CREATE PROCEDURE ProcError
AS
BEGIN
Declare @ErrorState INT = ERROR_STATE();
Declare @ErrorMessage INT = ERROR_MESSAGE();
Declare @ErrorProc INT = ERROR_PROCEDURE();
Select 1;
END;
Copy

Generierter Code

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

Empfehlung

Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an snowconvert-support@snowflake.com senden.

SSC-FDM-TS0024

CURRENT_TIMESTAMP in At Time Zone-Anweisung kann in bestimmten Fällen ein anderes Verhalten aufweisen.

Beschreibung

Diese FDM wird hinzugefügt, wenn die Anweisung At Time Zone den Parameter CURRENT_TIMESTAMP verwendet. Dies liegt daran, dass das Ergebnis in einigen Fällen abweichen kann.

Der Hauptunterschied besteht darin, dass in SQL ServerCURRENT_TIMESTAMP das aktuelle Systemdatum und die Uhrzeit in der Zeitzone des Servers zurückgibt, während in Snowflake CURRENT_TIMESTAMP das aktuelle Datum und die Uhrzeit in der UTC-(Coordinated Universal Time)-Zeitzone liefert.

Eingabecode:

Sql Server
 SELECT current_timestamp at time zone 'Hawaiian Standard Time';
Copy
Ergebnis

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

Generierter Code:
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 ***/);
Copy
Ergebnis

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

Best Practices

Dies ist ein Beispiel, wenn Sie das gleiche Format in Snowflake beibehalten möchten.

SQL Server
 SELECT current_timestamp at time zone 'Hawaiian Standard Time';
Copy
Ergebnis

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

In Snowflake können Sie ALTER SESSION verwenden, um die Standardzeitzone zu ändern. Beispiel:

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

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

2024-02-08 16:33:49.143

SSC-FDM-TS0025

DB_ID_UDF kann in bestimmten Fällen ein anderes Verhalten aufweisen.

Beschreibung

Diese FDM wird hinzugefügt, um zu verdeutlichen, dass die DB_ID_UDF- versucht, die DB_ID- SqlServer-Funktion so gut wie möglich nachzuahmen. In SqlServer ist der einer Datenbank zugewiesene Bezeichner eindeutig, und wenn die Datenbank gelöscht wird, wird diese ID nie wieder verwendet. In Snowflake hingegen entspricht dieser Bezeichner der Nummer, die der Datenbank bei ihrer Erstellung zugewiesen wird. Er ist ebenfalls eindeutig, jedoch fortlaufend – das bedeutet, wenn eine Datenbank gelöscht wird, kann diese Nummer der nächsten neu erstellten Datenbank zugewiesen werden.

Eingabecode:

Sql Server
 SELECT DB_ID('my_database');
Copy
Ergebnis

6

Generierter Code:
Snowflake
 SELECT
DB_ID_UDF('my_database') /*** SSC-FDM-TS0025 - DB_ID_UDF MAY HAVE A DIFFERENT BEHAVIOR IN CERTAIN CASES ***/;
Copy
Ergebnis

6

Best Practices

SSC-FDM-TS0026

DELETE-Fall wird in der temporären Tabelle nicht berücksichtigt

Beschreibung

Es gibt ein INSERT-Anweisungsmuster, das eine bestimmte Transformation erfordert, die das Erstellen einer temporären Tabelle beinhaltet. Diese FDM benachrichtigt, dass der DELETE-Fall bei der genannten Transformation nicht berücksichtigt wird. Weitere Informationen zu diesem Muster finden Sie unter [INSERT mit Table DML-Faktor mit MERGE alsDML] (../../../../translation-references/transact/transact-dmls.md#insert).

Eingabecode:

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';
Copy
Generierter Code:
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';
Copy

Best Practices

SSC-FDM-TS0027

SET ANSI_NULLS ON-Anweisung kann in Snowflake ein anderes Verhalten aufweisen

Beschreibung

Diese FDM gibt an, dass die SET ANSI_NULLS ON-Anweisung sich in Snowflake möglicherweise anders verhält. Weitere Informationen zu dieser Anweisung finden Sie im Artikel ANSI_NULLS.

Eingabecode

 SET ANSI_NULLS ON;
Copy
Generierter Code
 ----** SSC-FDM-TS0027 - SET ANSI_NULLS ON STATEMENT MAY HAVE A DIFFERENT BEHAVIOR IN SNOWFLAKE **
--SET ANSI_NULLS ON
Copy

Best Practices

SSC-FDM-TS0028

Die Ausgabeparameter müssen die gleiche Reihenfolge wie im ausgeführten Code haben.

Beschreibung

Diese FDM gibt an, dass die Ausgabeparameter in der SP_EXECUTESQL-Anweisung die gleiche Reihenfolge haben müssen wie in der auszuführenden SQL-Zeichenfolge. Andernfalls werden die Ausgabewerte nicht korrekt zugewiesen.

Codebeispiel

Korrekter Fall

Wie zu sehen ist, erscheinen@MaxAgeOUT und @MaxIdOUT in derselben Reihenfolge sowohl in der SQL-Zeichenfolge als auch in den Ausgabeparametern.

Bei der Konvertierung des Codes, weisen SELECT $1, $2 INTO :MAXAGE, :MAXID FROM TABLE(RESULT_SCAN(LAST_QUERY_ID())) die Werte korrekt zu.

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

Problemfall

Wie zu sehen ist, erscheinen @MaxAgeOUT und @MaxIdOUT in den Ausgabeparametern in einer anderen Reihenfolge als in der SQL-Zeichenfolge.

Bei der Konvertierung des Codes weisen SELECT $1, $2 INTO :MAXID, :MAXAGE FROM TABLE(RESULT_SCAN(LAST_QUERY_ID())) die Werte falsch zu. Max(AGE) wird :MAXID zugewiesen und Max(ID) wird :MAXAGE zugewiesen.

Dies muss manuell behoben werden, entweder durch Ändern der Reihenfolge der Ausgabeparameter in der SELECT INTO-Anweisung oder durch Anpassen der Reihenfolge in der SQL-Zeichenfolge.

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

Best Practices

  • Stellen Sie sicher, dass die OUTPUT-Parameter in der gleichen Reihenfolge sind, wie sie in der SQL-Zeichenfolge erscheinen.

  • Wenn Sie weitere Unterstützung benötigen, können Sie uns eine E-Mail an snowconvert-support@snowflake.com senden.

SSC-FDM-TS0029

SET NOCOUNT-Anweisung wird auskommentiert. Dies gilt nicht für Snowflake.

Beschreibung

Wenn SnowConvert AI auf eine SET NOCOUNT-Anweisung stößt, fügt es diese FDM hinzu. SnowConvert AI kommentiert anschließend die SET NOCOUNT-Anweisung aus, da sie in der Snowflake-Umgebung nicht relevant ist.

Codebeispiel

Eingabecode:

 SET NOCOUNT ON;
Copy
Generierter Code
 ----** SSC-FDM-TS0029 - SET NOCOUNT STATEMENT IS COMMENTED OUT, WHICH IS NOT APPLICABLE IN SNOWFLAKE. **
--SET NOCOUNT ON
Copy

Best Practices

SSC-FDM-TS0030

SET ANSI_PADDING ON-Anweisung wird auskommentiert. Das Gleiche gilt auch für Snowflake.

Beschreibung

Snowflake behält in Zeichenfolgenwerten immer nachstehende Leerzeichen bei, wenn diese in -Spalten eingefügt werden. Dieses Verhalten entspricht SET ANSI_PADDING ON im SQL-Server. Daher fügt SnowConvert AI beim Auftreten einer SET ANSI_PADDING ON-Anweisung diese FDM hinzu und kommentiert sie aus.

Codebeispiel

Eingabecode:

 SET ANSI_PADDING ON;
Copy
Generierter Code
 ----** SSC-FDM-TS0030 - SET ANSI_PADDING ON STATEMENT IS COMMENTED OUT, WHICH IS EQUIVALENT IN SNOWFLAKE. **
--SET ANSI_PADDING ON
Copy

Best Practices

SSC-FDM-TS0031

SET ANSI_WARNINGS ON-Anweisung wird auskommentiert, womit sich Snowflake im Allgemeinen an ANSI-Standardverhaltensweisen hält.

Beschreibung

Snowflake verhält sich im Allgemeinen so, als wäre ANSI_WARNINGS standardmäßig ON, insbesondere in Bezug auf die Fehlerbehandlung bei arithmetischem Überlauf, Division durch null und Zeichenkürzung. In der Regel müssen Sie kein explizites Äquivalent zu ANSI_WARNINGS in Snowflake „festlegen“. Daher fügt SnowConvert AI beim Auftreten einer SET ANSI_WARNINGS ON-Anweisung diese FDM hinzu und kommentiert sie aus.

Codebeispiel

Eingabecode:

 SET ANSI_WARNINGS ON;
Copy
Generierter Code
 ----** SSC-FDM-TS0031 - SET ANSI_WARNINGS ON STATEMENT IS COMMENTED OUT, WHICH SNOWFLAKE GENERALLY ADHERES TO ANSI-STANDARD BEHAVIORS. **
--SET ANSI_WARNINGS ON
Copy

Best Practices

SSC-FDM-TS0032

IDENTITY-Spalteneigenschaft wird in CREATE TABLE AS STATEMENT nicht unterstützt. Sie wird mit Hilfe von ROW_NUMBER() emuliert.

Beschreibung

Snowflake bietet keine direkte Möglichkeit, um CREATE TABLE AS mit einer Identitätsspalte auszuführen. SnowConvert fügt hingegen eine ROW_NUMBER-Spalte anstelle von IDENTITY hinzu, um die Enumeration der Identität zu simulieren. Bei dieser Transformation wird keine Identitätsspalte erstellt, was bedeutet, dass Zeilen, die nach der Erstellung eingefügt wurden, nicht automatisch hochgezählt werden.

Codebeispiel

Eingabecode:

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;
Copy
Generierter Code
--** 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;
Copy

Best Practices

SSC-FDM-TS0033

SET QUOTED_IDENTIFIER STATEMENT MAY HAVE A DIFFERENT BEHAVIOR IN SNOWFLAKE.

Beschreibung

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.

Codebeispiel

Eingabecode:

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
Copy
Generierter Code
----** 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";
Copy

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

Best Practices

SSC-FDM-TS0034

Beschreibung

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

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