AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 10952
Accepted
onedaywhen
onedaywhen
Asked: 2012-01-20 06:34:12 +0800 CST2012-01-20 06:34:12 +0800 CST 2012-01-20 06:34:12 +0800 CST

Significado de 'SET' na mensagem de erro 'Valor nulo é eliminado por um agregado ou outra operação SET'

  • 772

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- SETchave 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 SELECTconsultas 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_INSERTpropriedade, o que me traz de volta ao meu primeiro pensamento.

Alguém pode lançar alguma luz sobre o assunto?

sql-server
  • 3 3 respostas
  • 22144 Views

3 respostas

  • Voted
  1. Best Answer
    Martin Smith
    2012-05-28T22:50:50+08:002012-05-28T22:50:50+08:00

    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

    b) Caso contrário, seja TX a tabela de coluna única que é o resultado da aplicação de a <value expression>cada linha de T e eliminação de valores nulos. Se um ou mais valores nulos forem eliminados, uma condição de conclusão será levantada: aviso - valor nulo eliminado na função definida .

    Presumo que SETna 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.

    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
    
    • 14
  2. gbn
    2012-01-20T07:19:28+08:002012-01-20T07:19:28+08:00

    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_WARNINGSpadrão ON.
    Isso se refere puramente a se

    • um aviso é gerado por um valor NULL em um agregado.
    • truncamento silencioso ocorre na inserção/atualização para campos do tipo varchar

    Um exemplo:

    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;
    

    dá

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

    Outro exemplo:

    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
    

    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

    • 9
  3. Jack Douglas
    2012-01-20T07:41:27+08:002012-01-20T07:41:27+08:00

    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:

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

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como ver a lista de bancos de dados no Oracle?

    • 8 respostas
  • Marko Smith

    Quão grande deve ser o mysql innodb_buffer_pool_size?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    restaurar a tabela do arquivo .frm e .ibd?

    • 10 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve