it-swarm.it

Significato di "SET" nel messaggio di errore "Il valore null viene eliminato da un'operazione SET aggregata o altra"

Ho visto il messaggio "ANSI warning" sopra riportato oggi mentre eseguivo lo script di un collega (e non so quale delle molte affermazioni abbia causato la visualizzazione dell'avviso).

In passato l'ho ignorato: evito me stesso i null e quindi tutto ciò che li eliminerebbe è una buona cosa nel mio libro! Tuttavia, oggi la parola "SET" mi ha letteralmente urlato addosso e mi sono reso conto di non sapere quale fosse il significato della Parola in questo contesto.

Il mio primo pensiero, basato sul fatto che è in maiuscolo, è che si riferisce alla parola chiave SET e significa "assegnazione", come in

UPDATE <table> SET ...

...ON DELETE SET NULL...

SET IDENTITY_INSERT <table> ON

Secondo la Guida di SQL Server, la funzione "Avvisi ANSI" si basa su ISO/ANSI SQL-92, la specifica per la quale fa un solo uso del termine "Imposta operazione" in un titolo di sottosezione, quindi nel caso del titolo, nella sezione di assegnazione dei dati. Tuttavia, dopo una rapida ricerca su Google del messaggio di errore, vedo esempi che sono SELECT query apparentemente prive di assegnazione.

Il mio secondo pensiero, basato sulla formulazione dell'avvertimento di SQL Server, era che il significato matematico di set è implicito. Tuttavia, non penso che l'aggregazione in SQL stia parlando strettamente un'operazione impostata. Anche se il team di SQL Server lo considera un'operazione set, qual è lo scopo di mettere la parola "set" in maiuscolo?

Durante la ricerca su Google ho notato un messaggio di errore di SQL Server:

Table 'T' does not have the identity property. Cannot perform SET operation.

Le stesse parole "operazione SET" nello stesso caso qui possono solo fare riferimento all'assegnazione di IDENTITY_INSERT proprietà, che mi riporta al mio primo pensiero.

Qualcuno può far luce sulla questione?

18
onedaywhen

Stavo solo guardando attraverso la specifica SQL-92 e ho visto un passaggio che mi ha ricordato questa domanda.

Esiste infatti un avvertimento prescritto per questa situazione come indicato di seguito

b) Altrimenti, sia TX la tabella a colonna singola risultante dall'applicazione di <value expression> per ogni riga di T ed eliminando i valori null. Se uno o più valori null vengono eliminati, viene sollevata una condizione di completamento: avviso- valore null eliminato nella funzione impostata .

Suppongo che SET nel messaggio di errore di SQL Server sia un riferimento alla funzione set di quel messaggio di errore, anche se non sono sicuro del motivo per cui farebbe una distinzione tra aggregati e altre funzioni set, per quanto posso vedere che sono sinonimi. Il bit rilevante della grammatica è di seguito.

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

Risposta rapida

L '"altro SET * è probabilmente correlato alle versioni precedenti di SQL Server.

Lo vedevo di più quando lavoravo con SQL Server 6.5 e 7 ne sono sicuro, ma è passato del tempo. Molte stranezze sono state risolte + SQL Server segue più gli standard

Più a lungo:

Al giorno d'oggi, il messaggio è controllato da SET ANSI_WARNINGS il valore predefinito è ON.
Ciò si riferisce esclusivamente al se

  • un avviso viene generato da un valore NULL in un aggregato.
  • il troncamento silenzioso si verifica sull'inserimento/aggiornamento dei campi di tipo varchar

Un esempio:

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;

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

Un altro esempio:

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

Personalmente, ignoro l'avvertimento e lascio SET ANSI_WARNINGS ON a causa delle altre conseguenze sulle colonne calcolate e sulle viste indicizzate impostandolo su OFF.

Infine, potrebbe esserci un trigger o una colonna calcolata o una vista indicizzata che genera questo avviso da qualche parte

9
gbn

L'altro lato dell'avvertimento si riferisce alle operazioni 'set' e non alle operazioni 'SET' - che mi sembra un bug di messaggio - ad esempio, è anche prodotto con funzioni di windowing:

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.
*/