Bedeutung von 'SET' in der Fehlermeldung 'Nullwert wird durch eine aggregierte oder andere SET-Operation beseitigt'

18

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 SETSchlü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, SELECTbei 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_INSERTEigenschaft verweisen , was mich zu meinem ersten Gedanken zurückbringt.

Kann jemand Licht in die Sache bringen?

eines Tages, wenn
quelle
Ich habe immer davon ausgegangen, dass dies eine Operation an einer Reihe von Zeilen bedeutet.
Martin Smith
@MartinSmith Ich glaube nicht, da SETist immer in Großbuchstaben wie ein Schlüsselwort
JNK
@JNK - Ja, wenn ich darüber nachdenke, nehme ich an, dass es eine andere nicht aggregierte Operation geben muss, die diese Warnung auslöst, also denke ich, wenn wir herausfinden, was das ist, könnte es das erklären!
Martin Smith
SELECT * FROM sys.messages WHERE text LIKE '%SET operation%'gibt 3 weitere Ergebnisse an, die alle ebenfalls auf ein SETKeyword hinweisen .
Martin Smith
Ich habe mehr gesucht und es könnte sich tatsächlich um Mengenoperationen wie in mathematischen Mengen handeln. Ich habe in SS 2k-Dokumenten viele Verweise set operationsauf UNIONund INTERSECTund gefunden EXCEPT, aber unter NULLdiesen Umständen kann ich den Fehler nicht finden . Ich denke, dass es eine alte Fehlermeldung sein kann.
JNK

Antworten:

13

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

b) Ansonsten sei TX die einspaltige Tabelle, die das Ergebnis der Anwendung von <value expression>auf jede Zeile von T und der Eliminierung von Nullwerten ist. Wenn ein oder mehrere Nullwerte eliminiert werden, wird eine Beendigungsbedingung ausgelöst : Warnung - Nullwert wird in der gesetzten Funktion eliminiert .

Ich SETgehe 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.

6.5  <set function specification>

         Function

         Specify a value derived by the application of a function to an
         argument.

         Format

         <set function specification> ::=
                COUNT <left paren> <asterisk> <right paren>
              | <general set function>

         <general set function> ::=
                <set function type>
                    <left paren> [ <set quantifier> ] <value expression> <right paren>


         <set function type> ::=
              AVG | MAX | MIN | SUM | COUNT

         <set quantifier> ::= DISTINCT | ALL
Martin Smith
quelle
9

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_WARNINGSdie Standardeinstellung gesteuert ON.
Dies bezieht sich lediglich darauf, ob

  • Eine Warnung wird durch einen NULL-Wert in einem Aggregat generiert.
  • Beim Einfügen / Aktualisieren von Feldern vom Typ varchar erfolgt eine automatische Kürzung

Ein Beispiel:

DECLARE @foo TABLE (bar int NULL);
INSERT @foo VALUES (1), (2), (NULL);

SET ANSI_WARNINGS ON;
SELECT SUM(bar) FROM @foo;
SET ANSI_WARNINGS OFF;

SELECT SUM(bar) FROM @foo;

gibt

(3 row(s) affected)
---- -----------
ON   3
Warning: Null value is eliminated by an aggregate or other SET operation.
(1 row(s) affected)
---- -----------
OFF  3
(1 row(s) affected)

Ein anderes Beispiel:

DECLARE @foo TABLE (bar varchar(5) NULL);
SET ANSI_WARNINGS ON;
INSERT @foo VALUES ('123456'); -- error
GO
DECLARE @foo TABLE (bar varchar(5) NULL);
SET ANSI_WARNINGS OFF;
INSERT @foo VALUES ('123456'); -- OK
GO

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

gbn
quelle
Die Formulierung der Fehlermeldung impliziert definitiv, dass es eine nicht aggregierte Operation gibt (oder gab), die auch NULL für mich beseitigen könnte.
Martin Smith
@ Martin Smith: einverstanden. Es könnte jedoch indirekt sein, wie in meiner (neuen) letzten Aussage beschrieben. Oder eine Optimierungsstrategie, die im Plan zu sehen wäre
am
Schade, dass die Dokumente für alles, was älter als SQL Server 7.0 ist, nirgendwo online zu sein scheinen.
Martin Smith
1
Beispiel (so altes Zeug ist schwer zu finden): kbalertz.com/Feedback.aspx?kbNumber=149921/EN-US
gbn
1
Obwohl es tatsächlich so aussieht, als ob die SQL Server 7.0-Version der Nachricht nur Warnung: Nullwert aus Aggregat entfernt wurde. . Das SET operationBit wurde erst 2000 hinzugefügt.
Martin Smith
2

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:

select max(foo) over() as max_foo from (values (1), (2), (null)) as t(foo);
/*
max_foo
-------
2
2
2

Warning: Null value is eliminated by an aggregate or other SET operation.
*/
Jack Douglas
quelle
1
Scheint, als beziehe es sich immer noch auf den AggregationsteilMAX()
JNK
Wird das Aggregationsteil genannt? Ich weiß , was Sie natürlich bedeuten, aber sie sind unterschiedliche Vorgänge - zB zu vergleichen , im 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;
Jack Douglas
2
Es ist die Aggregatfunktion :) Ich glaube, der Fehler bezieht sich auf MAX(). Ich denke, dass Ihr zweites Beispiel mehr mit der Reihenfolge von Operationen zu tun hat, die Fensterfunktionen verwenden.
JNK
ok - sehen Sie, was Sie von den SS-Dokumenten bedeuten
Jack Douglas