Eu vi a mensagem 'Aviso ANSI' acima hoje ao executar o script de um colega (e não sei qual das muitas declarações causou a exibição do aviso).
No passado, eu ignorei: eu mesmo evito nulos e, portanto, qualquer coisa que os elimine é uma coisa boa em meu livro! No entanto, hoje a palavra 'SET' literalmente gritou para mim e percebi que não sei qual é o significado da palavra neste contexto.
Meu primeiro pensamento, com base no fato de ser maiúscula, é que se refere à palavra- SET
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' é baseado no ISO/ANSI SQL-92, cuja especificação faz apenas um uso do termo 'Definir operação' no título de uma subseção, portanto, no caso do título, no seção de atribuição de dados. No entanto, após uma rápida pesquisa da mensagem de erro no Google, vejo exemplos que são SELECT
consultas aparentemente sem atribuição envolvida.
Meu segundo pensamento, com base no texto do aviso do SQL Server, foi que o significado matemático de set está implícito. No entanto, não acho que a agregação em SQL seja estritamente falando uma operação de conjunto. Mesmo que a equipe do SQL Server considere uma operação de set, qual o objetivo de colocar a palavra 'set' em maiúsculas?
Ao pesquisar no Google, notei 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?
Eu estava apenas olhando a Especificação SQL-92 e vi uma passagem que me lembrou dessa questão.
Existe de fato um aviso prescrito para esta situação, conforme indicado abaixo
Presumo 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 faria uma distinção entre agregações e outras funções definidas, até onde posso ver, são sinônimos. A parte relevante da gramática está abaixo.Resposta rápida
O "outro SET* provavelmente está relacionado a versões mais antigas do SQL Server.
Eu costumava ver mais quando trabalhava com SQL Server 6.5 e 7, tenho certeza, mas já faz algum tempo. Muitas peculiaridades foram resolvidas + SQL Server segue os padrões mais
Mais tempo:
Hoje em dia, a mensagem é controlada pelo
SET ANSI_WARNINGS
padrãoON
.Isso se refere puramente a se
Um exemplo:
dá
Outro exemplo:
Pessoalmente, eu ignoro o aviso e deixo SET ANSI_WARNINGS ON por causa das outras consequências para colunas computadas e exibições indexadas de defini-lo como OFF.
Finalmente, pode haver um gatilho ou coluna computada ou exibição indexada gerando esse aviso em algum lugar
O outro lado do aviso refere-se a operações 'set' e não a operações 'SET' - isso me parece um bug de mensagem - por exemplo, também é produzido com funções de janelamento: