J'ai vu le message «Avertissement ANSI» ci-dessus aujourd'hui lors de l'exécution du script d'un collègue (et je ne sais pas laquelle des nombreuses instructions a provoqué l'affichage de l'avertissement).
Dans le passé, je l'ai ignoré: j'évite moi-même les valeurs nulles et donc tout ce qui pourrait les éliminer est une bonne chose dans mon livre! Cependant, aujourd'hui, le mot «SET» m'a littéralement crié dessus et j'ai réalisé que je ne sais pas quel est le sens du mot est censé être dans ce contexte.
Ma première pensée, basée sur le fait qu'il est en majuscules, est qu'il se réfère au SET
mot - clé et signifie «affectation», comme dans
UPDATE <table> SET ...
...ON DELETE SET NULL...
SET IDENTITY_INSERT <table> ON
Selon l'aide de SQL Server, la fonctionnalité «ANSI warnings» est basée sur ISO / ANSI SQL-92, dont la spécification n'utilise qu'une seule fois le terme «Set operation» dans un titre de sous-section, donc dans le cas du titre, dans le section d'attribution des données. Cependant, après une recherche rapide sur Google du message d'erreur, je vois des exemples qui sont des SELECT
requêtes avec apparemment aucune affectation impliquée.
Ma deuxième pensée, basée sur le libellé de l'avertissement SQL Server, était que la signification mathématique de set était implicite. Cependant, je ne pense pas que l'agrégation en SQL soit à proprement parler une opération d'ensemble. Même si l'équipe SQL Server considère qu'il s'agit d'une opération set, quel est le but de mettre le mot «set» en majuscules?
Pendant la recherche sur Google, j'ai remarqué un message d'erreur SQL Server:
Table 'T' does not have the identity property. Cannot perform SET operation.
Les mêmes mots «opération SET» dans le même cas ici ne peuvent faire référence qu'à l'attribution de la IDENTITY_INSERT
propriété, ce qui me ramène à ma première pensée.
Quelqu'un peut-il faire la lumière sur la question?
la source
SET
est toujours en majuscules comme un motSELECT * FROM sys.messages WHERE text LIKE '%SET operation%'
donne 3 autres résultats qui semblent tous indiquer également unSET
mot - clé.set operations
référence àUNION
etINTERSECT
etEXCEPT
, mais je ne parviens pas à trouver l'erreurNULL
dans aucune de ces circonstances. Je pense que cela peut être un message d'erreur hérité.Réponses:
Je regardais juste à travers la spécification SQL-92 et j'ai vu un passage qui m'a rappelé cette question.
Il y a en fait un avertissement prescrit pour cette situation comme indiqué ci-dessous
Je suppose que le
SET
dans le message d'erreur SQL Server est une référence à la fonction set de ce message d'erreur bien que je ne sais pas pourquoi cela ferait une distinction entre les agrégats et les autres fonctions set, pour autant que je puisse voir qu'ils sont synonymes. Le morceau pertinent de la grammaire est ci-dessous.la source
Réponse rapide
"L'autre SET * est probablement lié aux anciennes versions de SQL Server.
J'avais l'habitude de le voir plus en arrière lorsque je travaillais avec SQL Server 6.5 et 7, je suis sûr, mais cela fait un certain temps. De nombreuses bizarreries ont été corrigées + SQL Server suit les normes plus
Plus long:
De nos jours, le message est contrôlé par
SET ANSI_WARNINGS
lequel par défautON
.Cela concerne uniquement
Un exemple:
donne
Un autre exemple:
Personnellement, j'ignore l'avertissement et laisse SET ANSI_WARNINGS ON en raison des autres conséquences sur les colonnes calculées et les vues indexées de sa désactivation.
Enfin, il pourrait y avoir un déclencheur ou une colonne calculée ou une vue indexée générant cet avertissement quelque part
la source
SET operation
bit n'a pas été ajouté avant 2000.L'autre côté de l'avertissement fait référence aux opérations 'set' et non aux opérations 'SET' - qui me semblent être un bug de message - par exemple, elles sont également produites avec des fonctions de fenêtrage:
la source
MAX()
select max(foo) from (values (1), (2), (null)) as t(foo) where 1=2;
rapport àselect max(foo) over() from (values (1), (2), (null)) as t(foo) where 1=2;
MAX()
. Je pense que votre deuxième exemple doit faire plus avec l'ordre des opérations à l'aide des fonctions de fenêtre.