2016-09-17 4 views
2

Kürzlich stellte ich ein Szenario, in dem ISNULL Funktion mir abgeschnittene Daten zurückgibt, wenn die erste Zeichenfolge null ist.Trunkierungsproblem mit ISNULL-Funktion in SQL Server

ISNULL(a, b); 

fand ich die 5 Zeichen ist und b 10 Zeichen aber, wenn ein nur 5 Zeichen von b und nicht in voller Länge wird wieder null ist.

Ist dies ein bekanntes Problem?

+0

Überprüfen Sie, ob eine Variable mit der Größe von 5 nur deklariert ... –

Antwort

8

Es ist ein bekanntes Verhalten

Von MSDN

Der Wert check_expression zurückgegeben wird, wenn es nicht NULL ist; andernfalls wird ersatzwert zurückgegeben, nachdem implizit in den Typ von check_ausdruck konvertiert wurde, wenn die Typen unterschiedlich sind. Ersetzungswert kann abgeschnitten werden, wenn Ersetzungswert länger als Check_Ausdruck ist.

Verwenden COALESCE zu über kommen dieses Thema

SELECT COALESCE(a, b) From yourtable 

Hier eine Demo ist

CREATE TABLE #nulltest 
    ( 
    a CHAR(5), 
    b CHAR(10) 
) 

INSERT INTO #nulltest 
VALUES  ('12345','1234567890'), 
      (NULL,'1234567890') 

SELECT a, 
     b, 
     ISNULL(a, b) AS Isnull_Result, 
     COALESCE(a, b) AS Coalesce_Result 
FROM #nulltest 

Ergebnis:

╔═══════╦════════════╦═══════════════╦═════════════════╗ 
║ a ║  b  ║ Isnull_Result ║ Coalesce_Result ║ 
╠═══════╬════════════╬═══════════════╬═════════════════╣ 
║ 12345 ║ 1234567890 ║   12345 ║  12345  ║ 
║ NULL ║ 1234567890 ║   12345 ║  1234567890 ║ 
╚═══════╩════════════╩═══════════════╩═════════════════╝ 
0

Sie können auch CASE WHEN mit additi verwenden auf @Prdp antworten.

CASE WHEN a is null then b else a end AS caseWhen_Result