it-swarm-eu.dev

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

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 selbst Nullen und alles, was sie beseitigen würde, ist eine gute Sache in meinem Buch! Heute jedoch schrie mich das Wort 'SET' buchstäblich an und mir wurde klar, dass ich nicht weiß, was die Bedeutung des Wortes in diesem Zusammenhang sein soll.

Mein erster Gedanke, basierend auf der Tatsache, dass es sich um Großbuchstaben handelt, ist, dass er sich auf das Schlüsselwort SET bezieht 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, für dessen Spezifikation der Begriff "Set-Operation" in einem Unterabschnittstitel nur einmal verwendet wird, daher im Titelfall im Datenzuweisungsabschnitt. Nach einem kurzen Googeln der Fehlermeldung sehe ich jedoch Beispiele, bei denen es sich um SELECT Abfragen handelt, bei denen scheinbar keine Zuordnung erforderlich ist.

Mein zweiter Gedanke, basierend auf dem Wortlaut der SQL Server-Warnung, war, dass die mathematische Bedeutung von set impliziert ist. Ich denke jedoch nicht, dass die Aggregation in SQL streng genommen eine festgelegte Operation ist. Selbst wenn das SQL Server-Team davon ausgeht, dass es sich um eine festgelegte Operation handelt, was ist der Zweck, das Word-Set in Großbuchstaben zu setzen?

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' im gleichen Fall können sich hier nur auf die Zuweisung der Eigenschaft IDENTITY_INSERT Beziehen, was mich zu meinem ersten Gedanken zurückbringt.

Kann jemand Licht in die Sache bringen?

18
onedaywhen

Ich habe gerade die SQL-92-Spezifikation durchgesehen und eine Passage gesehen, die mich an diese Frage erinnerte.

Es gibt tatsächlich eine vorgeschriebene Warnung für diese Situation, wie unten angegeben

b) Andernfalls 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 Abschlussbedingung ausgelöst: Warnung - Nullwert in der eingestellten Funktion eliminiert .

Ich gehe davon aus, dass das SET in der SQL Server-Fehlermeldung ein Verweis auf die Set-Funktion dieser Fehlermeldung ist, obwohl ich nicht sicher bin, warum es, soweit ich, zwischen Aggregaten und anderen Set-Funktionen unterscheiden würde kann sehen, dass sie auch 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
13
Martin Smith

Schnelle Antwort

Das "andere SET * bezieht sich wahrscheinlich auf ältere SQL Server-Versionen.

Ich habe es früher mehr gesehen, 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 den Standards

Länger:

Heutzutage wird die Nachricht von SET ANSI_WARNINGS standardmäßig ON.
Dies bezieht sich lediglich darauf, ob

  • eine Warnung wird durch einen NULL-Wert in einem Aggregat generiert.
  • beim Einfügen/Aktualisieren für Felder vom Typ varchar tritt eine stille Kürzung auf

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 ON wegen der anderen Konsequenzen für berechnete Spalten und indizierte Ansichten beim Deaktivieren.

Schließlich könnte es irgendwo einen Auslöser oder eine berechnete Spalte oder eine indizierte Ansicht geben, die diese Warnung erzeugt

9
gbn

Die andere Seite der Warnung bezieht sich auf "Set" -Operationen, nicht auf "SET" -Operationen - das sieht für mich wie ein Nachrichtenfehler aus - zum Beispiel wird sie 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.
*/