Vi el mensaje anterior de 'advertencia ANSI' hoy cuando ejecuté el script de un colega (y no sé cuál de las muchas declaraciones causó que se mostrara la advertencia).
En el pasado lo ignoré: evito los valores nulos y, por lo tanto, ¡cualquier cosa que los elimine es algo bueno en mi libro! Sin embargo, hoy la palabra 'SET' literalmente me gritó y me di cuenta de que no sé cuál es el significado de la palabra en este contexto.
Mi primer pensamiento, basado en el hecho de que es mayúscula, es que se refiere a la SET
palabra clave y significa 'asignación', como en
UPDATE <table> SET ...
...ON DELETE SET NULL...
SET IDENTITY_INSERT <table> ON
De acuerdo con la Ayuda de SQL Server, la función 'Advertencias ANSI' se basa en ISO / ANSI SQL-92, la especificación para la cual hace un solo uso del término 'Establecer operación' en un título de subsección, por lo tanto, en el caso del título, en el sección de asignación de datos. Sin embargo, después de buscar rápidamente en Google el mensaje de error, veo ejemplos que son SELECT
consultas en las que aparentemente no hay ninguna tarea involucrada.
Mi segundo pensamiento, basado en la redacción de la advertencia de SQL Server, fue que el significado matemático de conjunto está implícito. Sin embargo, no creo que la agregación en SQL sea estrictamente una operación establecida. Incluso si el equipo de SQL Server lo considera una operación de conjunto, ¿cuál es el propósito de poner la palabra 'conjunto' en mayúsculas?
Mientras buscaba en Google, noté un mensaje de error de SQL Server:
Table 'T' does not have the identity property. Cannot perform SET operation.
Las mismas palabras 'operación SET' en el mismo caso aquí solo pueden referirse a la asignación de la IDENTITY_INSERT
propiedad, lo que me lleva a mi primer pensamiento.
¿Alguien puede arrojar alguna luz sobre el asunto?
fuente
SET
que siempre está en mayúsculas como una palabra claveSELECT * FROM sys.messages WHERE text LIKE '%SET operation%'
da otros 3 resultados que parecen indicarSET
palabras clave también.set operations
referirse aUNION
eINTERSECT
yEXCEPT
, pero no puedo obtener el error para llegar aNULL
cualquiera de esas circunstancias. Creo que puede ser un mensaje de error heredado.Respuestas:
Estaba mirando la especificación SQL-92 y vi un pasaje que me recordó esta pregunta.
De hecho, hay una advertencia prescrita para esta situación como se indica a continuación
Supongo que el
SET
mensaje de error en el servidor SQL es una referencia a la función de conjunto de ese mensaje de error, aunque no estoy seguro de por qué haría una distinción entre agregados y otras funciones de conjunto, por lo que puedo ver, son sinónimos. El bit relevante de la gramática está abajo.fuente
Respuesta rápida
El "otro SET * probablemente esté relacionado con versiones anteriores de SQL Server.
Solía verlo más cuando trabajaba con SQL Server 6.5 y 7, estoy seguro, pero ha pasado algún tiempo. Se han solucionado muchas peculiaridades + SQL Server sigue los estándares más
Más:
Hoy en día, el mensaje está controlado por los
SET ANSI_WARNINGS
valores predeterminadosON
.Esto se relaciona únicamente con si
Un ejemplo:
da
Otro ejemplo:
Personalmente, ignoro la advertencia y dejo SET ANSI_WARNINGS ON debido a las otras consecuencias para las columnas calculadas y las vistas indizadas de desactivarlo.
Finalmente, podría haber un disparador o una columna calculada o una vista indizada que genere esta advertencia en alguna parte
fuente
SET operation
bit no se agregó hasta el año 2000.El otro lado de la advertencia se refiere a las operaciones 'establecer', no a las operaciones 'SET', que me parecen un mensaje de error, por ejemplo, también se produce con funciones de ventanas:
fuente
MAX()
select max(foo) from (values (1), (2), (null)) as t(foo) where 1=2;
versusselect max(foo) over() from (values (1), (2), (null)) as t(foo) where 1=2;
MAX()
. Creo que su segundo ejemplo tiene que ver más con el orden de las operaciones utilizando funciones de ventana.