SQL Server-Funktion zum Verketten von Zeichenfolgen
Anzeigen von gut formatiertem Text
Diese Funktion wurde aus der Notwendigkeit geboren, eine Adresse in einer gut formatierten Zeichenfolge anzuzeigen. Beim Arbeiten mit dieser Art von Daten gibt es oft Leerzeichen, NULL-Werte und manchmal getrennten Text in den Datenfeldern. Die standardmäßige Verkettung der Spalten führte zu doppelten Trennzeichen mit Leerzeichen oder Kommas am Ende.
Vor diesem Hintergrund brauchten wir eine Möglichkeit, die Daten zu trennen, Leerzeichen auszuschließen, Leerzeichen zu entfernen und die nachgestellten Daten zu entfernen. Es gibt verschiedene Möglichkeiten, Standard-COALESCE allein zu verwenden, aber das hat mit den Rohlingen nicht ganz gereicht.
Wir haben unsere bewährte TextToRows-Funktion verwendet, um den Text aufzuteilen und zu sortieren, und dann die Textwerte in einen neuen String zurückgeschrieben. Der Vorteil davon ist, dass die Daten mit Trennzeichen Ihrer Wahl sowohl für die Eingabe als auch für die Ausgabe wiederverwendbar sind.
SQL
ALTER FUNCTION dbo.TextConc(@Text NVARCHAR(MAX),@Delim CHAR(1),@Sep CHAR(2)) RETURNS NVARCHAR(MAX) WITH SCHEMABINDING AS BEGINDECLARE @Str NVARCHAR(MAX)SELECT @Str=COALESCE(@Str+@Sep,'')+REPLACE(WordStr,@Delim,'')FROM dbo.TextToRows(@Delim,@Text)WHERE WordStr<>''RETURN REPLACE(@Str,@Sep+@Sep,@Sep)ENDGO
Testdaten
Zu Testzwecken können wir eine temporäre Tabelle erstellen und einige Adressen speichern. Kombinieren Sie die select-Anweisung mit der Funktion, und Sie können sehen, wie sie einen klar formatierten Datensatz zurückgibt, der sich perfekt für Anzeigezwecke eignet.
SQL
DECLARE @Address TABLE(AddressName NVARCHAR(100),AddressL1 NVARCHAR(100),AddressL2 NVARCHAR(100),AddressL3 NVARCHAR(100),AddressCity NVARCHAR(100),AddressCounty NVARCHAR(100),AddressCountry NVARCHAR(100),AddressPostCode NVARCHAR(100))INSERT INTO @AddressSELECT 'Mountain View','1600 Amphitheatre Parkway',NULL,NULL,'Mountain View','California','United States','94043'INSERT INTO @AddressSELECT 'London','1-13 St Giles High St',NULL,NULL,'London','London','United Kingdom','WC2H 8LG'SELECT dbo.TextConc(ISNULL(AddressName,'')+','+ISNULL(AddressL1,'')+','+ISNULL(AddressL2,'')+','+ISNULL(AddressL3,'')+','+ISNULL(AddressCity,'')+','+ISNULL(AddressCounty,'')+','+ISNULL(AddressCountry,'')+','+ISNULL(AddressPostCode,''),',',', ')FROM @Address
Results
Behalten Sie die Daten in der Tabelle bei
Da wir die Daten mit SCHEMABINDING erstellt haben, können wir sie auch als berechnete Spalte an eine Tabelle anhängen.
Beachten Sie, dass das Hinzufügen dieser Elemente die Abfrageleistung beeinträchtigen kann. Daher versuchen wir im Allgemeinen, die Daten persistent zu halten. Dies speichert die Daten tatsächlich in der Tabelle und wird nur bei Einfüge-/Aktualisierungstransaktionen berechnet.
SQL
CREATE TABLE TestAddress(AddressName NVARCHAR(100),AddressL1 NVARCHAR(100),AddressL2 NVARCHAR(100),AddressL3 NVARCHAR(100),AddressCity NVARCHAR(100),AddressCounty NVARCHAR(100),AddressCountry NVARCHAR(100),AddressPostCode NVARCHAR(100),AddressDisplay as dbo.TextConc(ISNULL(AddressName,'')+','+ISNULL(AddressL1,'')+','+ISNULL(AddressL2,'')+','+ISNULL(AddressL3,'')+','+ISNULL(AddressCity,'')+','+ISNULL(AddressCounty,'')+','+ISNULL(AddressCountry,'')+','+ISNULL(AddressPostCode,''),',',', ') PERSISTED)INSERT INTO TestAddressSELECT 'Mountain View','1600 Amphitheatre Parkway',NULL,NULL,'Mountain View','California','United States','94043'INSERT INTO TestAddressSELECT 'London','1-13 St Giles High St',NULL,NULL,'London','London','United Kingdom','WC2H 8LG'SELECT * FROM TestAddressDROP TABLE TestAddress