Jämför COALESCE och ISNULL
ISNULL-funktionen och COALESCE-uttrycket har ett liknande syfte men kan bete sig annorlunda.
- Eftersom ISNULL är en funktion, utvärderas den bara en gång. Som beskrivits ovan kan ingångsvärdena för COALESCE-uttrycket utvärderas flera gånger.
- Datatypsbestämningen av det resulterande uttrycket är annorlunda. ISNULL använder datatypen för den första parametern, COALESCE följer CASE-uttrycksreglerna och returnerar datatypen värde med högsta prioritet.
- Nullbarheten för resultatuttrycket är annorlunda för ISNULL och COALESCE. ISNULL-returvärdet anses alltid INTE NULL-bart (förutsatt att returvärdet är ett icke-nullbart) medan COALESCE med icke-nullparametrar anses vara NULL. Så uttrycken ISNULL(NULL, 1) ochCOALESCE(NULL, 1) även om de är likvärdiga har olika nullbarhetsvärden. Detta gör skillnad om du använder dessa uttrycks inberäknade kolumner, skapar nyckelrestriktioner eller gör returvärdet för en skalär UDF deterministisk så att den kan indexeras som visas i följande exempel.
> USE tempdb;
> GO
> -- This statement fails because the PRIMARY KEY cannot accept NULL values
> -- and the nullability of the COALESCE expression for col2
> -- evaluates to NULL.
> CREATE TABLE #Demo ( col1 integer NULL, col2 AS COALESCE(col1, 0) PRIMARY KEY, col3 AS ISNULL(col1, 0) );
>
> -- This statement succeeds because the nullability of the
> -- ISNULL function evaluates AS NOT NULL.
>
> CREATE TABLE #Demo ( col1 integer NULL, col2 AS COALESCE(col1, 0),
> col3 AS ISNULL(col1, 0) PRIMARY KEY );
Valideringar för ISNULL och COALESCE är också olika. Till exempel konverteras ett NULL-värde för ISNULL till int medan du för COALESCE måste ange en datatyp. ISNULL tar bara två parametrar medan COALESCE tar ett variabelantal parametrar.
Källa:BOL