2013-09-19 14 views

risposta

11

Secondo Microsoft documentation, per la funzione:

ISNULL(check_expression, replacement_value) 

replacement_value deve essere di un tipo che è implicitamente convertibile al tipo di check_expression. Si noti che il tipo per 'xy'+NULL è VARCHAR(3). Per questo motivo, la stringa 'ABCDEFGHIJ' viene convertita in VARCHAR(3) e quindi ritagliata.

Sembra strano il motivo per cui non è VARCHAR(2), ma questo è il modo in cui è: un carattere più lungo di 'xy'. È possibile giocare con questo SQLFiddle e verificare personalmente che il tipo per 'xy'+NULL sia lo stesso per l'espressione CASE WHEN 1=2 THEN 'XYZ' ELSE NULL END, che è NULL ma è implicitamente compatibile con VARCHAR(3).

Sembra che per l'espressione 'xy'+NULL la lunghezza percepita possa essere calcolata come 'xy' lunghezza della stringa (2) più 1 per ogni NULL aggiunto. Ad esempio, il tipo di 'xy'+NULL+NULL è VARCHAR(4), il tipo per 'xy'+NULL+NULL+NULL è VARCHAR(5) e così via - controlla questo SQLFiddle. Questo è estremamente strano, ma è così che funzionano MS SQL Server 2008 e 2012.

+0

Una buona spiegazione, anche se non sono convinto del varchar (3) invece di varchar (2) - Non riesco a trovarlo documentato da nessuna parte. – natenho

+0

Prova che è VARCHAR (3): http://sqlfiddle.com/#!3/d41d8/20987 – mvp

+1

Devo aumentare le informazioni qui per spiegare meglio il comportamento di COALESCE rispetto al comportamento ISNULL, da Microsoft [documentazione] (http://technet.microsoft.com/en-us/library/ms190349.aspx): L'espressione COALESCE è una scorciatoia sintattica per l'espressione CASE. Cioè, il codice COALESCE (espressione1, ... n) viene riscritto da Query Optimizer come la seguente espressione CASE: CASE QUANDO (espressione1 IS NOT NULL) THEN espressione1 QUANDO (espressione2 IS NOT NULL) quindi expression2 ... ELSE expressionN END -> Il tipo di ritorno del caso è dato dalla massima priorità expr. – natenho

1

ISNULL() converte il valore di sostituzione nel tipo dell'espressione di controllo. In questo caso, il tipo dell'espressione di controllo è CHAR(2), quindi la conversione del valore di sostituzione la tronca (sei sicuro di ottenere ABC e non solo AB?).

Dalla Microsoft documentation:

replacement_value può essere troncato se replacement_value è più lungo di check_expression.

+1

"ABC" di sicuro. – natenho