SnowConvert AI – SQL Server – Azure Synapse – DMLs¶
BETWEEN¶
Gibt TRUE zurück, wenn sich der Eingabeausdruck (numerisch oder Zeichenfolge) innerhalb der angegebenen unteren und oberen Grenze befindet.
Applies to
SQL Server
Azure Synapse Analytics
Bemerkung
Einige Teile des Ausgabecodes wurden aus Gründen der Übersichtlichkeit weggelassen.
Quellcode
Erwarteter Code
BULK-INSERT¶
Übersetzungsreferenz für die BULK INSERT-Anweisung.
Applies to
SQL Server
Azure Synapse Analytics
Einige Teile des Ausgabecodes wurden aus Gründen der Übersichtlichkeit weggelassen.
Die direkte Übersetzung für BULK INSERT ist die Snowflake COPY INTO-Anweisung. COPY INTO verwendet nicht direkt den Dateipfad, um die Werte abzurufen. Die Datei sollte vorher in einer STAGE vorhanden sein. Auch die in BULK INSERT verwendeten Optionen sollten in einem Snowflake FILE FORMAT angegeben werden, das von STAGE oder direkt von COPY INTO verwendet wird.
Um eine Datei zu STAGE hinzuzufügen, sollten Sie den Befehl PUT verwenden. Beachten Sie, dass der Befehl nur von der Datei SnowSQL CLI ausgeführt werden kann. Hier ist ein Beispiel für die Schritte, die wir vor der Ausführung von COPY INTO durchführen sollten:
SQL Server¶
Snowflake¶
As you see in the code above, SnowConvert AI identifies all the BULK INSERTS in the code, and for each instance, a new STAGE and FILE FORMAT will be created before the copy into execution. In addition, after the creation of the STAGE, a PUT command will be created as well to add the file to the stage.
The names of the generated statements are auto-generated using the current timestamp in seconds, to avoid collisions between their usages.
Schließlich werden alle Optionen für die Masseneinfügung, sofern zutreffend, den Dateiformatoptionen zugeordnet. Wenn die Option in Snowflake nicht unterstützt wird, wird sie kommentiert und eine Warnung hinzugefügt. Siehe auch [SSC-FDM-TS0004](../../general/technical-documentation/issues-and-troubleshooting/functional-difference/sqlServerFDM. md#ssc-fdm-ts0004).
Unterstützte Bulk-Optionen¶
SQL Server |
Snowflake |
|---|---|
FORMAT |
TYPE |
FIELDTERMINATOR |
FIELD_DELIMITER |
FIRSTROW |
SKIP_HEADER |
ROWTERMINATOR |
RECORD_DELIMITER |
FIELDQUOTE |
FIELD_OPTIONALLY_ENCLOSED_BY |
Allgemeiner Tabellenausdruck (CTE)¶
Applies to
SQL Server
Azure Synapse Analytics
Einige Teile des Ausgabecodes wurden aus Gründen der Übersichtlichkeit weggelassen.
Allgemeine Tabellenausdrücke werden in Snowflake SQL standardmäßig unterstützt.
Syntax¶
Snowflake SQL¶
Unterabfrage:
Rekursiver CTE:
Wobei:
Besondere Details¶
The RECURSIVE keyword does not exist in T-SQL, and the transformation does not actively add the keyword to the result. A warning is added to the output code to state this behavior.
Allgemeiner Tabellenausdruck mit SELECT INTO¶
Die folgende Transformation findet statt, wenn der Ausdruck WITH von einer SELECT INTO-Anweisung gefolgt wird, und er wird in eine TEMPORARY TABLE umgewandelt wird.
SQL Server:¶
Snowflake:¶
Allgemeiner Tabellenausdruck mit anderen Ausdrücken¶
Die folgende Transformation findet statt, wenn der Ausdruck WITH von den Anweisungen INSERT oder DELETE gefolgt wird.
SQL Server:¶
Snowflake:¶
Allgemeiner Tabellenausdruck mit Delete From Tabellenausdruck¶
Für diese Transformation gilt das nur für eine CTE (Allgemeiner Tabellenausdruck) mit einem Delete From, allerdings nur für einige bestimmte CTEs. Es darf nur eine CTE haben, und sie muss innerhalb einer Funktion von ROW_NUMBER oder RANK haben.
Der Zweck von CTE mit der Funktion Delete muss es sein, Duplikate aus einer Tabelle zu entfernen. Falls CTE mit Delete eine andere Art von Daten entfernen will, wird diese Transformation nicht angewendet.
Sehen wir uns ein Beispiel an. Für ein funktionierendes Beispiel müssen wir zunächst eine Tabelle mit einigen Daten erstellen.
Beachten Sie, dass es einen doppelten Wert gibt. Die Zeilen 8 und 12 fügen denselben Wert ein. Jetzt werden wir die doppelten Zeilen in einer Tabelle eliminieren.
Wenn wir einen Select aus der Tabelle ausführen, wird das folgende Ergebnis angezeigt
ID |
Wert |
StringValue |
|---|---|---|
100 |
100 |
First |
200 |
200 |
Second |
300 |
300 |
Third |
400 |
400 |
Fourth |
Note that the duplicated rows have been removed. To preserve this functionality in Snowflake, which does not support DELETE from a CTE, SnowConvert transforms the statement into the following:
Wie Sie sehen, wird die Abfrage in eine Create Or Replace-Tabelle umgewandelt.
To test it in Snowflake, you will need the table.
Wenn wir nun das Ergebnis der Transformation ausführen und dann ein Select, um zu prüfen, ob die doppelten Zeilen gelöscht wurden, wäre dies das Ergebnis.
ID |
Wert |
StringValue |
|---|---|---|
100 |
100 |
First |
200 |
200 |
Second |
300 |
300 |
Third |
400 |
400 |
Fourth |
Allgemeiner Tabellenausdruck mit der Anweisung MERGE¶
Die folgende Transformation findet statt, wenn der Ausdruck WITH von der Anweisung MERGE gefolgt wird, und er wird in eine MERGE INTO umgewandelt.
SQL Server:¶
Snowflake:¶
Allgemeiner Tabellenausdruck mit der Anweisung UPDATE¶
Die folgende Transformation findet statt, wenn auf den Ausdruck WITH eine Anweisung UPDATE folgt. Er wird in eine UPDATE-Anweisung umgewandelt.
SQL Server:¶
Snowflake:¶
Bekannte Probleme¶
Es wurden keine Probleme gefunden.
Zugehörige EWIs¶
[SSC-EWI-0108](../../general/technical-documentation/issues-and-troubleshooting/conversion-issues/generalEWI. md#ssc-ewi-0108): Die folgende Unterabfrage stimmt mit mindestens einem der als ungültig angesehenen Muster überein und kann Kompilierungsfehler verursachen.
SSC-PRF-TS0001: Leistungswarnung – Rekursion für CTE nicht geprüft. Möglicherweise ist ein rekursives Schlüsselwort erforderlich.
DELETE¶
Übersetzungsreferenz für die DELETE-Anweisung von Transact-SQL in Snowflake
Applies to
SQL Server
Azure Synapse Analytics
Bemerkung
Einige Teile des Ausgabecodes wurden aus Gründen der Übersichtlichkeit weggelassen.
Beschreibung¶
Removes one or more rows from a table or view in SQL Server. For more information, see the SQL Server DELETE documentation.
Beispielhafte Quellcode-Muster¶
Beispieldaten¶
SQL Server¶
Snowflake¶
Grundlegender Fall¶
Die Transformation für die Anweisung DELETE ist ziemlich einfach, wenn auch mit einigen Vorbehalten. Einer dieser Vorbehalte ist die Art und Weise, wie Snowflake mehrere Quellen in der FROM-Klausel unterstützt. Es gibt jedoch eine Entsprechung in Snowflake, wie unten gezeigt.
SQL Server¶
Snowflake¶
Bemerkung
Beachten Sie, dass das Vorhandensein von TABLE2 T2 in der FROM-Klausel die Erstellung der USING-Klausel erfordert, da das ursprüngliche DELETE für T1 galt.
Duplikate aus einer Tabelle löschen¶
Die folgende Dokumentation erläutert ein gängiges Muster zum Entfernen doppelter Zeilen aus einer Tabelle in SQL Server. Bei diesem Ansatz wird die Funktion ROW_NUMBER verwendet, um die Daten auf der Grundlage der key_value zu partitionieren, die eine oder mehrere durch Kommas getrennte Spalten sein können. Löschen Sie dann alle Datensätze, die einen Zeilennummernwert größer als 1 erhalten haben. Dieser Wert zeigt an, dass es sich bei den Datensätzen um Duplikate handelt. Sie können die referenzierte Dokumentation lesen, um die Verhaltensweise dieser Methode zu verstehen und sie nachzustellen.
Das folgende Beispiel verwendet diesen Ansatz zum Entfernen von Duplikaten aus einer Tabelle und ihrer Entsprechung in Snowflake. Die Transformation besteht aus einer INSERT OVERWRITE -Anweisung, die die Tabelle abschneidet (alle Daten entfernt) und dann die Zeilen in derselben Tabelle wieder einfügt, wobei die duplizierten Zeilen ignoriert werden. Der Ausgabecode wird unter Berücksichtigung der gleichen PARTITION BY- und ORDER BY-Klauseln generiert, die im Originalcode verwendet wurden.
SQL Server¶
Erstellen Sie eine Tabelle mit doppelten Zeilen
Duplikate einfügen¶
Ausgabe¶
someID |
col2 |
col3 |
col4 |
col5 |
|---|---|---|---|---|
10 |
true |
false |
false |
true |
10 |
true |
false |
false |
true |
11 |
true |
true |
false |
true |
12 |
false |
false |
true |
true |
12 |
false |
false |
true |
true |
13 |
true |
false |
true |
false |
14 |
true |
false |
true |
false |
14 |
true |
false |
true |
false |
Duplikate entfernen¶
Ausgabe¶
someID |
col2 |
col3 |
col4 |
col5 |
|---|---|---|---|---|
10 |
true |
false |
false |
true |
11 |
true |
true |
false |
true |
12 |
false |
false |
true |
true |
13 |
true |
false |
true |
false |
14 |
true |
false |
true |
false |
Snowflake¶
Erstellen Sie eine Tabelle mit doppelten Zeilen
Duplikate einfügen¶
Ausgabe¶
someID |
col2 |
col3 |
col4 |
col5 |
|---|---|---|---|---|
10 |
true |
false |
false |
true |
10 |
true |
false |
false |
true |
11 |
true |
true |
false |
true |
12 |
false |
false |
true |
true |
12 |
false |
false |
true |
true |
13 |
true |
false |
true |
false |
14 |
true |
false |
true |
false |
14 |
true |
false |
true |
false |
Duplikate entfernen¶
Ausgabe¶
someID |
col2 |
col3 |
col4 |
col5 |
|---|---|---|---|---|
10 |
true |
false |
false |
true |
11 |
true |
true |
false |
true |
12 |
false |
false |
true |
true |
13 |
true |
false |
true |
false |
14 |
true |
false |
true |
false |
Warnung
Bedenken Sie, dass es mehrere Variationen dieses Musters geben kann, die aber alle auf demselben Prinzip beruhen und dieselbe Struktur haben.
DELETE WITH INNER JOIN¶
SQL-SERVER¶
Ausgabe¶
EmployeeID |
FirstName |
LastName |
DepartmentID |
|---|---|---|---|
5 |
Michael |
Davis |
null |
6 |
Lucas |
Parker |
8 |
Snowflake¶
Ausgabe¶
EmployeeID |
FirstName |
LastName |
DepartmentID |
|---|---|---|---|
5 |
Michael |
Davis |
null |
6 |
Lucas |
Parker |
8 |
DELETE WITH LEFT JOIN¶
SQL Server¶
Ausgabe¶
EmployeeID |
FirstName |
LastName |
DepartmentID |
|---|---|---|---|
1 |
John |
Doe |
1 |
2 |
Jane |
Smith |
2 |
3 |
Bob |
Johnson |
1 |
4 |
Alice |
Brown |
3 |
Snowflake¶
Ausgabe¶
EmployeeID |
FirstName |
LastName |
DepartmentID |
|---|---|---|---|
1 |
John |
Doe |
1 |
2 |
Jane |
Smith |
2 |
3 |
Bob |
Johnson |
1 |
4 |
Alice |
Brown |
3 |
DELETE WITH RIGHT JOIN¶
SQL-SERVER¶
Ausgabe¶
EmployeeID |
FirstName |
LastName |
DepartmentID |
|---|---|---|---|
5 |
Michael |
Davis |
null |
6 |
Lucas |
Parker |
8 |
Snowflake¶
Ausgabe¶
EmployeeID |
FirstName |
LastName |
DepartmentID |
|---|---|---|---|
5 |
Michael |
Davis |
null |
6 |
Lucas |
Parker |
8 |
Bekannte Probleme¶
FULL JOIN nicht unterstützt\ FULL JOIN kann nicht mit der (+)-Syntax dargestellt werden. Wird die Anweisung gefunden, warnt SnowConvert AI Benutzende mit einer FDM davor.
SQL Server¶
Snowflake¶
Zugehörige EWIs¶
SSC-EWI-TS0081: Die Verwendung von FULL JOIN in einer DELETE-Anweisung wird nicht unterstützt
DROP-STATEMENT¶
DROP-Anweisungen
Applies to
SQL Server
Azure Synapse Analytics
Einige Teile des Ausgabecodes wurden aus Gründen der Übersichtlichkeit weggelassen.
DROP TABLE¶
Transact-SQL¶
Snowflake¶
Übersetzung¶
Die Übersetzung für einzelne DROP TABLE-Anweisungen ist sehr einfach. Solange nur eine Tabelle in der Anweisung gelöscht wird, bleibt sie unverändert.
Beispiel:
Der einzige bemerkenswerte Unterschied zwischen SQL Server und Snowflake tritt auf, wenn die Eingabeanweisung mehr als eine Tabelle fallen lässt. In diesen Szenarien wird für jede Tabelle, die gelöscht werden soll, eine andere DROP TABLE-Anweisung erstellt.
Beispiel:
SQL Server¶
Snowflake¶
EXISTS¶
Transact-SQL-Unterabfragen mit EXISTS-Anweisung – Transformationsdetails
Applies to
SQL Server
Azure Synapse Analytics
Einige Teile des Ausgabecodes wurden aus Gründen der Übersichtlichkeit weggelassen.
Typen von Unterabfragen¶
Unterabfragen können als korreliert oder unkorrelierte kategorisiert werden:
Eine korrelierte Unterabfrage verweist auf eine oder mehrere Spalten außerhalb der Unterabfrage. (Die Spalten werden normalerweise in der WHERE-Klausel der Unterabfrage referenziert.) Eine korrelierte Unterabfrage kann als Filter für die Tabelle betrachtet werden, auf die sie verweist, als ob die Unterabfrage für jede Zeile der Tabelle in der äußeren Abfrage ausgewertet würde.
Eine unkorrelierte Unterabfrage enthält keine derartigen externen Spaltenverweise. Sie ist eine unabhängige Abfrage, deren Ergebnisse einmal an die äußere Abfrage zurückgegeben und von dieser verwendet werden (nicht pro Zeile).
Die Anweisung EXISTS wird als korrelierte Unterabfrage betrachtet.
SQL-SERVER¶
Snowflake¶
IN¶
Transact-SQL-Unterabfragen mit IN-Anweisung – Transformationsdetails
Applies to
SQL Server
Azure Synapse Analytics
Einige Teile des Ausgabecodes wurden aus Gründen der Übersichtlichkeit weggelassen.
Der IN Operator prüft, ob ein Ausdruck in den Werten enthalten ist, die von einer Unterabfrage zurückgegeben werden.
SQL-SERVER¶
Snowflake¶
INSERT¶
Übersetzungsreferenz für die INSERT-Anweisung von SQL Server in Snowflake
Applies to
SQL Server
Azure Synapse Analytics
Einige Teile des Ausgabecodes wurden aus Gründen der Übersichtlichkeit weggelassen.
Beschreibung¶
Adds one or more rows to a table or a view in SQL Server. For more information, see the SQL Server INSERT documentation.
Syntax-Vergleich¶
Die grundlegende Insert-Grammatik ist in beiden SQL-Sprachen gleich. Es gibt jedoch noch einige andere Syntaxelemente in SQL Server, die Unterschiede aufweisen. So kann der Entwickler beispielsweise mit dem Zuweisungsoperator einen Wert zu einer Spalte hinzufügen. Die genannte Syntax wird ebenfalls in die grundlegende Insert-Syntax umgewandelt.
Snowflake¶
SQL Server¶
Beispielhafte Quellcode-Muster¶
Grundlegendes INSERT¶
SQL Server¶
Snowflake¶
INSERT with assign operator¶
SQL Server¶
Snowflake¶
INSERT ohne INTO¶
SQL Server¶
Snowflake¶
INSERT mit einem allgemeinen Tabellenausdruck¶
SQL Server¶
Snowflake¶
INSERT mit Tabellen-DML-Faktor mit MERGE als DML¶
Dieser Fall ist so spezifisch, da die INSERT-Anweisung eine SELECT-Abfrage aufweist und die FROM-Klausel der erwähnten SELECT-Abfrage eine MERGE DML-Anweisung enthält. Auf der Suche nach einem Äquivalent in Snowflake werden die nächsten Anweisungen erstellt: eine temporäre Tabelle, die konvertierte MERGE-Anweisung und schließlich die INSERT-Anweisung.#x20;
SQL Server¶
Snowflake¶
NOTE: Wie der Name des Musters vermuten lässt, ist es ONLY für Fälle, in denen die Einfügung mit einer SELECT-Anweisung erfolgt … wobei der Body eine MERGE-Anweisung enthält.#x20;
Bekannte Probleme¶
1. Syntaxelemente, die besondere Zuordnungen erfordern:
[INTO]: Dieses Schlüsselwort ist in Snowflake obligatorisch und sollte hinzugefügt werden, wenn es nicht vorhanden ist.
[DEFAULT VALUES]: Fügt den Standardwert in alle in der Einfügung angegebenen Spalten ein. Sollte in VALUES umgewandelt werden (DEFAULT, DEFAULT, …), die Anzahl der hinzugefügten DEFAULTs entspricht der Anzahl der Spalten, die durch die Einfügung geändert werden. Im Moment wird eine Warnung hinzugefügt.
SQL Server¶
Snowflake¶
2. Syntaxelemente werden nicht unterstützt oder sind irrelevant:
[TOP (Ausdruck) [PERCENT]]: Gibt die Anzahl oder den Prozentsatz der Zeilen an, die eingefügt werden sollen. Nicht unterstützt.
[rowset_function\_limited]: Es handelt sich entweder um OPENQUERY() oder OPENROWSET(), die zum Lesen von Daten von entfernten Servern verwendet werden. Nicht unterstützt.
[WITH table\_hint_limited]: Diese werden verwendet, um Lese-/Schreibsperren für Tabellen zu erhalten. Nicht relevant in Snowflake.
[<OUTPUT-Klausel]: Gibt eine Tabelle oder ein Resultset an, in das die eingefügten Zeilen ebenfalls eingefügt werden. Nicht unterstützt.
[execute_statement]: Kann verwendet werden, um eine Abfrage zum Abrufen von Daten auszuführen. Nicht unterstützt.
[dml_table_source]: Ein temporäres Resultset, das durch die OUTPUT-Klausel einer anderen DML-Anweisung erzeugt wurde. Nicht unterstützt.
3. Der DELETE-Fall wird nicht berücksichtigt.
Für INSERT mit dem DML-Tabellenfaktor mit MERGE als DML-Muster wird der DELETE-Fall in der Lösung nicht berücksichtigt. Wenn also die MERGE-Anweisung des Quellcodes einen DELETE-Fall enthält, denken Sie daran, dass sie in diesem Fall möglicherweise nicht wie erwartet funktioniert.
Zugehörige EWIs¶
[SSC-EWI-0073](../../general/technical-documentation/issues-and-troubleshooting/conversion-issues/generalEWI. md#ssc-ewi-0073): Überprüfung der Funktionsäquivalenz ausstehend.
[SSC-FDM-TS0026](../../general/technical-documentation/issues-and-troubleshooting/functional-difference/sqlServerFDM. md#ssc-fdm-ts0026): DELETE-Fall wird nicht berücksichtigt.
MERGE¶
MERGE-Anweisung von Transact-SQL – Transformationsdetails
Applies to
SQL Server
Azure Synapse Analytics
Syntax-Vergleich¶
Snowflake¶
Transact-SQL¶
Beispiel¶
Angenommen, es gibt folgenden Quellcode:
SQL Server¶
Sie können in etwa Folgendes erwarten:
Snowflake¶
Zugehörige EWIs¶
[SSC-EWI-0021](../../general/technical-documentation/issues-and-troubleshooting/conversion-issues/generalEWI. md#ssc-ewi-0021): Syntax wird in Snowflake nicht unterstützt.
SELECT¶
Übersetzungsreferenz für die Konvertierung der SELECT-Anweisung von SQL Server in Snowflake
Applies to
SQL Server
Azure Synapse Analytics
Einige Teile des Ausgabecodes wurden aus Gründen der Übersichtlichkeit weggelassen.
Beschreibung¶
Allows the selection of one or more rows or columns of one or more tables in SQL Server. For more information, see the SQL Server SELECT documentation.
Beispielhafte Quellcode-Muster¶
SELECT WITH COLUMN ALIASES¶
Das folgende Beispiel zeigt, wie Sie Spalten-Aliase in Snowflake verwenden können. Es wird erwartet, dass die ersten beiden Spalten aus dem SQL Server-Code mit dem Schlüsselwort AS von einer Zuweisungsform in eine normalisierte Form umgewandelt werden. In der dritten und vierten Spalte werden gültige Snowflake-Formate verwendet.
SQL Server¶
Snowflake¶
SELECT TOP¶
SQL Server¶
Snowflake¶
SELECT INTO¶
Das folgende Beispiel zeigt, dass SELECT INTO in CREATE TABLE AS umgewandelt wird. Das liegt daran, dass es in Snowflake kein Äquivalent für SELECT INTO gibt. Zum Erstellen einer Tabelle auf Basis einer Abfrage muss CREATE TABLE AS verwendet werden.
SQL Server¶
Snowflake¶
Ein weiterer Fall ist die Einbeziehung von Mengenoperatoren wie EXCEPT und INTERSECT. Die Transformation ist im Grunde die gleiche wie die vorherige.
SQL Server¶
Snowflake¶
SELECT TOP Additional Arguments¶
Da die Schlüsselwörter PERCENT und WITH TIES das Ergebnis beeinflussen und von Snowflake nicht unterstützt werden, werden sie auskommentiert und als Fehler hinzugefügt.
SQL Server¶
Snowflake¶
SELECT FOR¶
The FOR XML clause is transformed differently depending on whether the path is empty or not.
FOR XML PATH(‚‘) — Empty path (string concatenation pattern):
FOR XML PATH('') is a common SQL Server pattern used for string concatenation (before STRING_AGG was introduced). When the path is empty and there is no ROOT clause, the query is transformed to use LISTAGG with CONCAT instead of XML functions, because the intent is string aggregation rather than XML generation.
SQL Server¶
Snowflake¶
When there is a single expression, CONCAT is omitted:
SQL Server¶
Snowflake¶
FOR XML PATH — Non-empty path (XML generation):
When the path is not empty, the FOR XML PATH clause is converted to use FOR_XML_UDF with OBJECT_CONSTRUCT to produce XML output. This conversion emits SSC-FDM-TS0016 because the resulting XML format in Snowflake may differ from SQL Server.
SQL Server¶
Snowflake¶
SELECT OPTION¶
Die OPTION-Klausel wird von Snowflake nicht unterstützt. Sie wird auskommentiert und als Warnung während der Transformation hinzugefügt.
Beachten Sie, dass die Anweisung OPTION aus der Transformation entfernt wurde, da sie in Snowflake nicht relevant ist oder nicht benötigt wird.
SQL Server¶
Snowflake¶
SELECT WITH¶
Die WITH-Klausel wird von Snowflake nicht unterstützt. Sie wird auskommentiert und als Warnung während der Transformation hinzugefügt.
Beachten Sie, dass die Anweisung WITH(NOLOCK, NOWAIT) aus der Transformation entfernt wurde, da sie in Snowflake nicht relevant ist oder nicht benötigt wird.
SQL Server¶
Snowflake¶
Zugehörige EWIs¶
[SSC-EWI-0040](../../general/technical-documentation/issues-and-troubleshooting/conversion-issues/generalEWI. md#ssc-ewi-0040): Anweisung wird nicht unterstützt.
[SSC-FDM-TS0016](../../general/technical-documentation/issues-and-troubleshooting/functional-difference/sqlServerFDM. md#ssc-fdm-ts0016): XML-Spalten in Snowflake haben möglicherweise ein anderes Format
SET-OPERATORS¶
Applies to
SQL Server
Azure Synapse Analytics
Die Mengenoperatoren in TSQL und Snowflake weisen dieselbe Syntax und dieselben unterstützten Szenarien auf (EXCEPT, INTERSECT, UNION und UNION ALL), mit Ausnahme von MINUS, das in TSQL nicht unterstützt wird, was zu demselben Code bei der Konvertierung führt.
TRUNCATE¶
TRUNCATE-Anweisung von Transact-SQL – Transformationsdetails
Applies to
SQL Server
Azure Synapse Analytics
Einige Teile des Ausgabecodes wurden aus Gründen der Übersichtlichkeit weggelassen.
SQL Server¶
Snowflake¶
UPDATE¶
Übersetzungsreferenz für die Konvertierung der UPDATE-Anweisung von SQL Server in Snowflake
Applies to
SQL Server
Azure Synapse Analytics
Bemerkung
Einige Teile des Ausgabecodes wurden aus Gründen der Übersichtlichkeit weggelassen.
Beschreibung¶
Changes existing data in a table or view in SQL Server. For more information, see the SQL Server UPDATE documentation.
Beispielhafte Quellcode-Muster¶
Grundlegendes UPDATE¶
Die Konvertierung für eine reguläre UPDATE-Anweisung ist sehr einfach. Da die grundlegenden UPDATE-Struktur in Snowflake standardmäßig unterstützt wird, sind die Ausreißer die Teile, bei denen Sie einige Unterschiede feststellen werden.
SQL Server¶
Snowflake¶
Kartesische Produkte¶
SQL Server erlaubt das Hinzufügen von zirkulären Referenzen zwischen der Zieltabelle der Aktualisierungsanweisung und der FROM-Klausel. Bei der Ausführung entfernt der Datenbankoptimierer jedes erzeugte kartesische Produkt. Andernfalls optimiert Snowflake dieses Szenario derzeit nicht und erzeugt ein kartesisches Produkt, das im Ausführungsplan überprüft werden kann. \
Um dies zu beheben, wird bei einem JOIN, bei dem eine der Tabellen mit dem Aktualisierungsziel übereinstimmt, diese Referenz entfernt und zur WHERE-Klausel hinzugefügt. Sie wird verwendet, um die Daten zu filtern und eine Mengenoperation zu vermeiden.
SQL Server¶
Snowflake¶
OUTPUT-Klausel.¶
Die OUTPUT-Klausel wird von Snowflake nicht unterstützt.
SQL Server¶
Snowflake¶
CTE¶
Die WITH CTE-Klausel wird in die interne Abfrage in der Aktualisierungsanweisung verschoben, um von Snowflake unterstützt zu werden.
SQL Server¶
Snowflake¶
TOP-Klausel.¶
Die TOP-Klausel wird von Snowflake nicht unterstützt.
SQL Server¶
Snowflake¶
WITH TABLE HINT LIMITED¶
Die UPDATE WITH-Klausel wird von Snowflake nicht unterstützt.
SQL Server¶
Snowflake¶
Zugehörige EWIs¶
[SSC-EWI-0021](../../general/technical-documentation/issues-and-troubleshooting/conversion-issues/generalEWI. md#ssc-ewi-0021): Syntax wird in Snowflake nicht unterstützt.
UPDATE WITH JOIN¶
Übersetzungsspezifikation für die UPDATE-Anweisung mit WHERE- und JOIN-Klauseln
Warnung
Dieser Abschnitt ist noch in Arbeit, die Informationen können sich in Zukunft ändern.
Beschreibung¶
Das Muster UPDATE FROM wird verwendet, um Daten auf der Grundlage von Daten aus anderen Tabellen zu aktualisieren. Diese SQLServer-Dokumentation enthält ein einfaches Beispiel.
Sie finden die entsprechende SQL Server-Syntax in der Dokumentation.
SQL Server-Syntax¶
table_name: Die Tabelle oder Ansicht, die Sie aktualisieren.SET: Gibt die Spalten und ihre neuen Werte an. DieSET-Klausel weist einer oder mehreren Spalten einen neuen Wert (oder Ausdruck) zu.FROM: Wird verwendet, um eine oder mehrere Quelltabellen anzugeben (wie ein Join). Damit können Sie festlegen, woher die Daten für die Aktualisierung kommen.WHERE: Gibt an, welche Zeilen auf der Grundlage der Bedingung(en) aktualisiert werden sollen. Ohne diese Klausel würden alle Zeilen der Tabelle aktualisiert werden.OPTION (query_hint): Gibt Hinweise zur Optimierung von Abfragen an.
Snowflake-Syntax¶
Die Snowflake-Syntax können Sie auch in der Snowflake-Dokumentation nachlesen.
Bemerkung
Snowflake unterstützt keine JOINs in UPDATE Klauseln.
Erforderliche Parameter
_
target_table:_Gibt die zu aktualisierende Tabelle an._
col_name:Gibt den Namen einer Spalte in _target_tablean. Geben Sie nicht den Tabellennamen an.UPDATE t1 SET t1.col = 1ist beispielsweise ungültig._
value:_ Gibt den neuen Wert an, der in _col_name_ festgelegt werden soll.
Optionale Parameter
FROM``_additional_tables:_ Gibt eine oder mehrere Tabellen an, die zur Auswahl der zu aktualisierenden Zeilen oder zum Setzen neuer Werte verwendet werden sollen.Beachten Sie, dass die Wiederholung der Zieltabelle zu einem Self-Join führt.WHERE``Bedingung:_ Der Ausdruck, der die Zeilen in der Zieltabelle angibt, die aktualisiert werden sollen. Standard: Kein Wert (alle Zeilen der Zieltabelle werden aktualisiert)
Zusammenfassung der Übersetzung¶
JOIN-Typ von SQL Server |
Beste Alternative von Snowflake |
|---|---|
Einfacher |
Verwenden Sie die Zieltabelle in der |
Mehrere |
Verwenden Sie die Zieltabelle in der |
Mehrere |
Unterabfrage + IN-Operation verwenden |
Einfacher |
Unterabfrage + IN-Operation verwenden |
Mehrere |
Mit der |
Mehrere |
Mit der |
Einfacher RIGHT JOIN |
Verwenden Sie die Tabelle in der |
Hinweis 1: Ein einfaches JOIN kann die Tabelle in der FROM-Klausel verwenden und bei Bedarf Filter in der WHERE-Klausel hinzufügen.
Hinweis 2: Andere Ansätze können einen (+)-Operanden enthalten, um die JOINs zu definieren.
Beispielhafte Quellcode-Muster¶
Datenkonfiguration¶
SQLServer¶
Snowflake¶
Data Insertion for samples
Fall 1: Einzelnes INNER JOIN-Update¶
Wenn die Tabelle INNER JOIN innerhalb der FROM-Anweisungen verwendet wird, wird sie automatisch zu INNER JOIN. Beachten Sie, dass es mehrere Ansätze zur Unterstützung von JOINs in UPDATE-Anweisungen in Snowflake gibt. Dies ist eines der einfachsten Muster, um die Lesbarkeit zu gewährleisten.
SQL Server¶
Ausgabe¶
CustomerID |
Menge |
CustomerName |
|---|---|---|
1 |
10 |
John Doe |
Snowflake¶
Ausgabe¶
CustomerID |
Menge |
CustomerName |
|---|---|---|
1 |
10 |
John Doe |
Andere Ansätze:
MERGE INTO
IN Operation
Fall 2: Update mehrere INNER JOIN¶
SQL Server¶
Ausgabe¶
CustomerID |
Menge |
CustomerName |
|---|---|---|
3 |
5 |
Alice Johnson |
Snowflake¶
Ausgabe¶
CustomerID |
Menge |
CustomerName |
|---|---|---|
3 |
5 |
Alice Johnson |
Fall 3: Update mehrere INNER JOIN mit Aggregatbedingungen¶
SQL Server¶
Ausgabe¶
CustomerID |
CustomerName |
Menge |
Preis (price) |
|---|---|---|---|
11 |
Jack Grey |
6 |
29,99 |
18 |
Quincy Brown |
6 |
15,99 |
20 |
Sam Green |
6 |
89,99 |
22 |
Ursula Rot |
6 |
9,99 |
24 |
Wendy Schwarz |
6 |
49,99 |
Snowflake¶
Ausgabe¶
CustomerID |
CustomerName |
Menge |
Preis (price) |
|---|---|---|---|
11 |
Jack Grey |
6 |
29,99 |
18 |
Quincy Brown |
6 |
15,99 |
20 |
Sam Green |
6 |
89,99 |
22 |
Ursula Rot |
6 |
9,99 |
24 |
Wendy Schwarz |
6 |
49,99 |
Fall 4: Update einzelner LEFT JOIN¶
SQL Server¶
Ausgabe¶
OrderID |
CustomerID |
ProductID |
Menge |
OrderDate |
|---|---|---|---|---|
5 |
null |
5 |
7 |
2024-11-05 |
13 |
null |
13 |
13 |
2024-11-13 |
Snowflake¶
Ausgabe¶
OrderID |
CustomerID |
ProductID |
Menge |
OrderDate |
|---|---|---|---|---|
5 |
null |
5 |
7 |
2024-11-05 |
13 |
null |
13 |
13 |
2024-11-13 |
Bemerkung
Dieser Ansatz funktioniert in Snowflake nicht, da er die erforderlichen Zeilen nicht aktualisiert:
UPDATE Orders O SET O.Quantity = 13 FROM Customers C WHERE O.CustomerID = C.CustomerID AND C.CustomerID IS NULL AND O.ProductID = 13;
Fall 5: Update mehrere LEFT JOIN und RIGHT JOIN¶
Dies ist ein komplexeres Muster. Um mehrere LEFT JOINs zu übersetzen, sehen Sie sich bitte das folgende Muster an:
Bemerkung
LEFT JOIN und RIGHT JOIN hängen von der Reihenfolge in der FROM-Klausel ab.
SQL Server¶
Ausgabe¶
OrderID |
CustomerID |
ProductID |
Menge |
OrderDate |
|---|---|---|---|---|
3 |
3 |
3 |
3 |
2024-11-12 |
Snowflake¶
Ausgabe¶
OrderID |
CustomerID |
ProductID |
Menge |
OrderDate |
|---|---|---|---|---|
3 |
3 |
3 |
3 |
2024-11-12 |
Fall 6: Update gemischte INNER JOIN und LEFT JOIN¶
SQL Server¶
Ausgabe¶
CustomerID |
CustomerName |
Menge |
|---|---|---|
null |
null |
4 |
Snowflake¶
Ausgabe¶
CustomerID |
CustomerName |
Menge |
|---|---|---|
null |
null |
4 |
Fall 7: Update einzelner RIGHT JOIN¶
SQL Server¶
Ausgabe¶
OrderID |
CustomerID |
ProductID |
Menge |
CustomerName |
|---|---|---|---|---|
3 |
3 |
3 |
1000 |
Alice Johnson |
Snowflake¶
Ausgabe¶
OrderID |
CustomerID |
ProductID |
Menge |
CustomerName |
|---|---|---|---|---|
3 |
3 |
3 |
1000 |
Alice Johnson |
Bekannte Probleme¶
Da
UPDATEin Snowflake die Verwendung vonJOINsnicht direkt erlaubt, kann es Fälle geben, die nicht den beschriebenen Mustern entsprechen.
UPDATE mit LEFT und RIGHT JOIN¶
Übersetzungsspezifikation für die UPDATE-Anweisung mit JOINs
Applies to
SQL Server
Azure Synapse Analytics
Warnung
Teilweise unterstützt in Snowflake
Beschreibung¶
Das Muster UPDATE FROM wird verwendet, um Daten auf der Grundlage von Daten aus anderen Tabellen zu aktualisieren. Diese SQLServer-Dokumentation enthält ein einfaches Beispiel.
Sie finden die entsprechende SQL Server-Syntax in der Dokumentation.
SQL Server-Syntax¶
table_name: Die Tabelle oder Ansicht, die Sie aktualisieren.SET: Gibt die Spalten und ihre neuen Werte an. DieSET-Klausel weist einer oder mehreren Spalten einen neuen Wert (oder Ausdruck) zu.FROM: Wird verwendet, um eine oder mehrere Quelltabellen anzugeben (wie ein Join). Damit können Sie festlegen, woher die Daten für die Aktualisierung kommen.WHERE: Gibt an, welche Zeilen auf der Grundlage der Bedingung(en) aktualisiert werden sollen. Ohne diese Klausel würden alle Zeilen der Tabelle aktualisiert werden.OPTION (query_hint): Gibt Hinweise zur Optimierung von Abfragen an.
Snowflake-Syntax¶
Die Snowflake-Syntax können Sie auch in der Snowflake-Dokumentation nachlesen.
Bemerkung
Snowflake unterstützt keine JOINs in UPDATE Klauseln.
Erforderliche Parameter
_
target_table:_Gibt die zu aktualisierende Tabelle an._
col_name:Gibt den Namen einer Spalte in _target_tablean. Geben Sie nicht den Tabellennamen an.UPDATE t1 SET t1.col = 1ist beispielsweise ungültig._
value:_ Gibt den neuen Wert an, der in _col_name_ festgelegt werden soll.
Optionale Parameter
FROM``_additional_tables:_ Gibt eine oder mehrere Tabellen an, die zur Auswahl der zu aktualisierenden Zeilen oder zum Setzen neuer Werte verwendet werden sollen.Beachten Sie, dass die Wiederholung der Zieltabelle zu einem Self-Join führt.WHERE``Bedingung:_ Der Ausdruck, der die Zeilen in der Zieltabelle angibt, die aktualisiert werden sollen. Standard: Kein Wert (alle Zeilen der Zieltabelle werden aktualisiert)
Zusammenfassung der Übersetzung¶
Wie in der Syntaxbeschreibung erläutert wird, gibt es nicht direkt eine äquivalente Lösung für JOINs innerhalb der UPDATE-Klausel. Aus diesem Grund besteht der Ansatz zur Transformation dieser Anweisungen darin, den Operator (+) zu der Spalte hinzuzufügen, der die erforderlichen Daten logisch zur Tabelle hinzufügt. Dieser Operator (+) wird zu den Fällen hinzugefügt, für die die Tabellen im Abschnitt LEFT/RIGHT JOIN referenziert werden.
Notice that there are other languages that use this operator (+) and the position of the operator may determine the type of join. In this specific case in Snowflake, the position will not determine the join type but the association with the logically needed tables and columns will.
Even when there are other alternative as MERGE clause or the usages of a CTE; these alternatives tend to turn difficult to read when there are complex queries, and get extensive.
Beispielhafte Quellcode-Muster¶
Datenkonfiguration¶
SQL Server¶
Snowflake¶
LEFT JOIN¶
SQL Server¶
Ausgabe vor der Abfrage¶
Col1 |
Col2 |
Col3 |
Col4 |
Col5 |
Col6 |
|---|---|---|---|---|---|
1 |
A1 |
B1 |
C1 |
null |
null |
2 |
A2 |
B2 |
C2 |
null |
null |
3 |
A3 |
B3 |
C3 |
null |
null |
Ausgabe nach der Abfrage¶
Col1 |
Col2 |
Col3 |
Col4 |
Col5 |
Col6 |
|---|---|---|---|---|---|
1 |
A1 |
B1 |
C1 |
X1 |
Description1 |
2 |
A2 |
B2 |
C2 |
X2 |
Description2 |
3 |
A3 |
B3 |
C3 |
X3 |
Description3 |
Snowflake¶
Ausgabe vor der Abfrage¶
Col1 |
Col2 |
Col3 |
Col4 |
Col5 |
Col6 |
|---|---|---|---|---|---|
1 |
A1 |
B1 |
C1 |
null |
null |
2 |
A2 |
B2 |
C2 |
null |
null |
3 |
A3 |
B3 |
C3 |
null |
null |
Ausgabe nach der Abfrage¶
Col1 |
Col2 |
Col3 |
Col4 |
Col5 |
Col6 |
|---|---|---|---|---|---|
1 |
A1 |
B1 |
C1 |
X1 |
Description1 |
2 |
A2 |
B2 |
C2 |
X2 |
Description2 |
3 |
A3 |
B3 |
C3 |
X3 |
Description3 |
RIGHT JOIN¶
SQL Server¶
Ausgabe vor der Abfrage¶
Col1 |
Col2 |
Col3 |
Col4 |
Col5 |
Col6 |
|---|---|---|---|---|---|
1 |
A1 |
B1 |
C1 |
null |
null |
2 |
A2 |
B2 |
C2 |
null |
null |
3 |
A3 |
B3 |
C3 |
null |
null |
Ausgabe nach der Abfrage¶
Col1 |
Col2 |
Col3 |
Col4 |
Col5 |
Col6 |
|---|---|---|---|---|---|
1 |
A1 |
B1 |
C1 |
**X1 |
null |
2 |
A2 |
B2 |
C2 |
**X2 |
null |
3 |
A3 |
B3 |
C3 |
**X3 |
null |
Snowflake¶
Ausgabe vor der Abfrage¶
Col1 |
Col2 |
Col3 |
Col4 |
Col5 |
Col6 |
|---|---|---|---|---|---|
1 |
A1 |
B1 |
C1 |
null |
null |
2 |
A2 |
B2 |
C2 |
null |
null |
3 |
A3 |
B3 |
C3 |
null |
null |
Ausgabe nach der Abfrage¶
Col1 |
Col2 |
Col3 |
Col4 |
Col5 |
Col6 |
|---|---|---|---|---|---|
1 |
A1 |
B1 |
C1 |
**X1 |
null |
2 |
A2 |
B2 |
C2 |
**X2 |
null |
3 |
A3 |
B3 |
C3 |
**X3 |
null |
Bekannte Probleme¶
Es kann Muster geben, die aufgrund von Unterschieden in der Logik nicht übersetzt werden können.
Wenn Ihr Abfragemuster zutrifft, überprüfen Sie nicht-deterministische Zeilen: „Wenn eine FROM-Klausel eine JOIN zwischen Tabellen enthält (z. B.
t1undt2), kann eine Zielzeile int1mit mehr als einer Zeile in der Tabellet2verknüpft werden (d.h. übereinstimmen). Wenn dies der Fall ist, wird die Zielzeile als mehrfach verknüpfte Zeile bezeichnet. Beim Aktualisieren einer mehrfach verknüpften Zeile steuert der Sitzungsparameter ERROR_ON_NONDETERMINISTIC_UPDATE das Ergebnis der Aktualisierung“ (Snowflake-Dokumentation).