Hoje, vi a mensagem 'aviso ANSI' acima ao executar o script de um colega (e não sei qual das muitas declarações fez com que o aviso fosse mostrado).
No passado, eu o ignorei: evito anular a mim mesmo e, portanto, qualquer coisa que os elimine é uma coisa boa no meu livro! No entanto, hoje a palavra 'SET' literalmente gritou comigo e percebi que não sabia qual o significado da palavra nesse contexto.
Meu primeiro pensamento, baseado no fato de estar em maiúscula, é que ele está se referindo à SET
palavra - chave e significa 'atribuição', como em
UPDATE <table> SET ...
...ON DELETE SET NULL...
SET IDENTITY_INSERT <table> ON
De acordo com a Ajuda do SQL Server, o recurso 'avisos ANSI' baseia-se na ISO / ANSI SQL-92, cuja especificação utiliza apenas o termo 'operação Set' em um título de subseção, portanto, em maiúsculas e minúsculas. seção de atribuição de dados. No entanto, depois de pesquisar rapidamente a mensagem de erro, vejo exemplos que são SELECT
consultas com aparentemente nenhuma atribuição envolvida.
Meu segundo pensamento, com base na redação do aviso do SQL Server, foi que o significado matemático de conjunto está implícito. No entanto, não acho que a agregação no SQL seja estritamente uma operação definida. Mesmo que a equipe do SQL Server considere uma operação definida, qual é o objetivo de colocar a palavra 'conjunto' em maiúsculas?
Ao pesquisar no Google, observei uma mensagem de erro do SQL Server:
Table 'T' does not have the identity property. Cannot perform SET operation.
As mesmas palavras 'operação SET' no mesmo caso aqui só podem se referir à atribuição da IDENTITY_INSERT
propriedade, o que me traz de volta ao meu primeiro pensamento.
Alguém pode lançar alguma luz sobre o assunto?
fonte
SET
sempre em maiúsculas completos como uma palavra-chaveSELECT * FROM sys.messages WHERE text LIKE '%SET operation%'
fornece três outros resultados que parecem também indicarSET
palavras-chave.set operations
referindo-UNION
eINTERSECT
eEXCEPT
, mas eu não posso obter o erro de chegar aNULL
qualquer uma dessas circunstâncias. Eu acho que pode ser uma mensagem de erro herdada.Respostas:
Eu estava olhando a Especificação SQL-92 e vi uma passagem que me lembrou essa pergunta.
De fato, existe um aviso prescrito para esta situação, conforme indicado abaixo
Suponho que
SET
na mensagem de erro do SQL Server seja uma referência à função definida dessa mensagem de erro, embora não tenha certeza de por que isso faria uma distinção entre agregadas e outras funções definidas, até onde posso ver que são sinônimos. O bit relevante da gramática está abaixo.fonte
Resposta rápida
O "outro SET * provavelmente está relacionado a versões mais antigas do SQL Server.
Eu costumava vê-lo mais quando trabalhava com o SQL Server 6.5 e 7, tenho certeza, mas já faz algum tempo. Muitas peculiaridades foram resolvidas + o SQL Server segue mais os padrões
Mais longo:
Atualmente, a mensagem é controlada pela
SET ANSI_WARNINGS
qual o padrão éON
.Isso se refere apenas a se
Um exemplo:
dá
Outro exemplo:
Pessoalmente, ignoro o aviso e deixo SET ANSI_WARNINGS ON por causa das outras consequências para as colunas computadas e exibições indexadas de desativá-lo.
Por fim, pode haver um gatilho ou coluna computada ou exibição indexada gerando esse aviso em algum lugar
fonte
SET operation
bit não foi adicionado até 2000.O outro lado do aviso refere-se às operações 'set' e não às operações 'SET' - que me parecem um erro de mensagem - por exemplo, também é produzido com funções de janelas:
fonte
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()
. Acho que o seu segundo exemplo tem mais a ver com a ordem das operações usando as funções da janela.