Ich habe heute beim Ausführen des Skripts eines Kollegen die obige Meldung 'ANSI-Warnung' gesehen (und ich weiß nicht, welche der vielen Anweisungen dazu geführt hat, dass die Warnung angezeigt wurde).
In der Vergangenheit habe ich es ignoriert: Ich vermeide Nullen selbst und alles, was sie beseitigen würde, ist eine gute Sache in meinem Buch! Aber heute hat mich das Wort 'SET' buchstäblich angeschrien und mir wurde klar, dass ich nicht weiß, was das Wort in diesem Zusammenhang bedeuten soll.
Mein erster Gedanke, basierend auf der Tatsache, dass es sich um Großbuchstaben handelt, ist, dass es sich um das SET
Schlüsselwort handelt und wie in "Zuweisung" bedeutet
UPDATE <table> SET ...
...ON DELETE SET NULL...
SET IDENTITY_INSERT <table> ON
Laut der SQL Server-Hilfe basiert die Funktion "ANSI-Warnungen" auf ISO / ANSI SQL-92. In der Spezifikation wird der Begriff "Set-Operation" in einem Unterabschnittstitel nur einmal verwendet, also in der Groß- und Kleinschreibung in der Datenzuweisungsabschnitt. Nach einem kurzen Durchsuchen der Fehlermeldung werden jedoch Beispiele angezeigt, SELECT
bei denen es sich anscheinend um Abfragen ohne Zuordnung handelt.
Mein zweiter Gedanke, basierend auf dem Wortlaut der SQL Server-Warnung, war, dass die mathematische Bedeutung von set impliziert ist. Ich glaube jedoch nicht, dass die Aggregation in SQL streng genommen eine festgelegte Operation ist. Sogar wenn das SQL Server-Team es für eine festgelegte Operation hält, welchen Zweck hat es, das Wort "set" in Großbuchstaben zu schreiben?
Beim Googeln ist mir eine SQL Server-Fehlermeldung aufgefallen:
Table 'T' does not have the identity property. Cannot perform SET operation.
Die gleichen Worte "SET-Operation" können hier im selben Fall nur auf die Zuweisung der IDENTITY_INSERT
Eigenschaft verweisen , was mich zu meinem ersten Gedanken zurückbringt.
Kann jemand Licht in die Sache bringen?
quelle
SET
ist immer in Großbuchstaben wie ein SchlüsselwortSELECT * FROM sys.messages WHERE text LIKE '%SET operation%'
gibt 3 weitere Ergebnisse an, die alle ebenfalls auf einSET
Keyword hinweisen .set operations
aufUNION
undINTERSECT
und gefundenEXCEPT
, aber unterNULL
diesen Umständen kann ich den Fehler nicht finden . Ich denke, dass es eine alte Fehlermeldung sein kann.Antworten:
Ich habe gerade die SQL-92-Spezifikation durchgesehen und eine Passage gefunden, die mich an diese Frage erinnerte.
Es gibt tatsächlich eine vorgeschriebene Warnung für diese Situation, wie unten angegeben
Ich
SET
gehe davon aus, dass die SQL Server-Fehlermeldung einen Verweis auf die Set-Funktion dieser Fehlermeldung enthält, obwohl ich nicht sicher bin, warum sie zwischen Aggregaten und anderen Set-Funktionen unterscheiden würde, soweit ich sehe, dass sie synonym sind. Das relevante Bit der Grammatik ist unten.quelle
Schnelle Antwort
Das "andere SET *" bezieht sich wahrscheinlich auf ältere SQL Server-Versionen.
Ich bin mir sicher, dass ich es früher öfter gesehen habe, als ich mit SQL Server 6.5 und 7 gearbeitet habe, aber es ist einige Zeit her. Viele Macken wurden ausgebügelt + SQL Server folgt mehr Standards
Länger:
Heutzutage wird die Nachricht durch
SET ANSI_WARNINGS
die Standardeinstellung gesteuertON
.Dies bezieht sich lediglich darauf, ob
Ein Beispiel:
gibt
Ein anderes Beispiel:
Persönlich ignoriere ich die Warnung und lasse SET ANSI_WARNINGS AN, da dies andere Konsequenzen für berechnete Spalten und indizierte Ansichten hat.
Schließlich könnte irgendwo ein Trigger oder eine berechnete Spalte oder eine indizierte Ansicht diese Warnung erzeugen
quelle
SET operation
Bit wurde erst 2000 hinzugefügt.Die andere Seite der Warnung bezieht sich auf "set" -Operationen und nicht auf "SET" -Operationen - das sieht für mich nach einem Nachrichtenfehler aus - zum Beispiel wird es auch mit Fensterfunktionen erzeugt:
quelle
MAX()
select max(foo) from (values (1), (2), (null)) as t(foo) where 1=2;
Vergleichselect max(foo) over() from (values (1), (2), (null)) as t(foo) where 1=2;
MAX()
. Ich denke, dass Ihr zweites Beispiel mehr mit der Reihenfolge von Operationen zu tun hat, die Fensterfunktionen verwenden.