2013-03-11 12 views
6

Vorrei avere una domanda sull'uso di null.Tipo di dati di operando tipo void non valido per l'operatore di somma

Se corro questa query

SELECT SUM(x) 
FROM (SELECT NULL AS x) AS DerivedTable 

ottengo il messaggio di errore

"tipo void tipo di dati operando non è valido per l'operatore somma."

Tuttavia, se creo una tabella con un campo nullable e la utilizzo all'interno della somma aggregata, ignorerà il valore NULL e sostanzialmente sommerà tutto il resto dei record.

CREATE TABLE #temp1(x int) 
insert into #temp values (NULL),(3),(5) 

SELECT SUM(x) FROM #temp1 

risultato è 8.

C'è una spiegazione logica di questo? Sarebbe a causa del tipo di dati di NULL non è stato dichiarato nella query con la tabella derivata ma è stato dichiarato con la tabella temporanea? Inoltre, mi piacerebbe davvero sapere se esiste un modo per produrre questo messaggio di errore quando viene eseguito da una tabella o da una tabella derivata, proprio come il secondo esempio # temp1. Qualsiasi esempio che produce questo messaggio di errore quando viene eseguito da una tabella o un'espressione di tabella è altamente benvenuto.

Grazie a tutti

risposta

11

Questo è davvero perché il tipo della colonna non si può dedurre nello scenario tabella derivata.

Se si modifica la dichiarazione e si utilizza in modo esplicito un tipo sulla colonna, la selezione funzionerà.

SELECT SUM(x) FROM (SELECT CAST(NULL AS INTEGER) AS x) AS DerivedTable 

come sarà la seguente dichiarazione in cui il tipo si può dedurre

SELECT SUM(x) FROM (SELECT NULL AS x UNION SELECT 1) AS DerivedTable 

SQL Fiddle


Questo sarebbe anche rispondere alla tua seconda domanda. Poiché non è possibile creare una tabella senza dichiarare i tipi, non è possibile produrre un'istruzione che generi quel messaggio di errore specifico.

+0

Grazie Lieven, Pensa a qualsiasi situazione in cui questo messaggio di errore viene generato tramite una tabella o un'espressione di tabella, proprio come il tuo secondo esempio ma con un errore. – user2155565

Problemi correlati