CONCAT (Neuerung in SQL Server 2012)

Bei der Verknüpfung von Strings mit der Gefahr auch NULL-Werte dabei zu haben, gibt es bisher schon verschiedene Wege zum Ziel. Mit SQL Server 2012 ist eine neuer dazu gekommen.

Laut ANSI-Standard erzeugt die Verknüpfung eines Strings mit einem NULL-Wert ebenfalls wieder einen NULL-Wert. Das ist ja auch verständlich, wenn man NULL-Werte als "undefiniert" betrachtet. Etwas definiertes plus etwas undefiniertes, gibt natürlich ebenfalls etwas undefiniertes.

Man sollte den Schalter SET CONCAT_NULL_YIELDS_NULL bereits heute nie auf OFF stellen, da in einer zukünftigen Version dies wohl nicht mehr unterstützt werden wird. Jede Anwendung, die dann versucht diese Option zu setzen, erzeugt einen Fehler.

Gab es bislang die Möglichkeiten mit der Funktion IsNull oder mit dem Ausdruck COALESCE diesem Umstand Rechnung zu tragen und NULL-Werte zu eliminieren, bekommen wir mit SQL Server 2012 nun eine einfachere Syntax in der Form von CONCAT dazu.

IsNull ist ein proprietäres Konstrukt in T-SQL, während COALESCE und CONCAT dem ANSI-Standard entsprechen.

Das folgende Beispiel soll die Unterschiede und Möglichkeiten demonstrieren:

SET NOCOUNT ON
DECLARE
@Testdaten AS TABLE(Address1 VARCHAR(50), Address2 VARCHAR(50), City VARCHAR(50), State VARCHAR(50), Zip VARCHAR(50));

INSERT INTO @Testdaten(Address1, Address2, City, State, Zip) VALUES('Jim van Kampen', 'Parker Street 7','Boston','Massachusettes','02101');
INSERT INTO @Testdaten(Address1, Address2, City, State, Zip) VALUES('Frederik van Kampen', NULL,'Boston',NULL,'02101');

-- NULL YIELDS NULL führt zu NULL-Ergebnis
SELECT Address1 + CHAR(13) + CHAR(10) +
  
Address2  + CHAR(13) + CHAR(10) +
  
City + ', ' + State + CHAR(13) +  CHAR(10) +
  
Zip AS [NULL YIELDS NULL führt zu NULL-Ergebnis]
FROM @Testdaten;


-- Vor SQL Server 2012
SELECT COALESCE(Address1,'') + CHAR(13) + CHAR(10) +
  
COALESCE(Address2,'')  + CHAR(13) + CHAR(10) +
  
COALESCE(City,'') + ', ' + COALESCE(State,'') + CHAR(13) +  CHAR(10) +
  
COALESCE(Zip,'') AS [Vor SQL Server 2012 mit COALESCE]
FROM @Testdaten;


SELECT ISNULL(Address1,'') + CHAR(13) + CHAR(10) +
  
ISNULL(Address2,'')  + CHAR(13) + CHAR(10) +
  
ISNULL(City,'') + ', ' + ISNULL(State,'') + CHAR(13) +  CHAR(10) +
  
ISNULL(Zip,'') AS [Vor SQL Server 2012 mit IsNull]
FROM @Testdaten;

-- Neue Syntax ab SQL Server 2012
SELECT CONCAT
(
  
Address1, CHAR(13), CHAR(10),
  
Address2, CHAR(13), CHAR(10),
  
City, ', ', State, CHAR(13), CHAR(10),
  
Zip
) AS [Neue Syntax ab SQL Server 2012 mit CONCAT]
FROM @Testdaten;




  Concat_2012.sql