Funkcja SQL Server do łączenia ciągów
Wyświetlanie dobrze sformatowanego tekstu
Ta funkcja zrodziła się z potrzeby wyświetlania adresu w dobrze sformatowanym ciągu. Podczas pracy z tego rodzaju danymi często występują spacje, wartości NULL i czasami oddzielony tekst w polach danych. Standardowe konkatenacje kolumn prowadziły do podwójnych separatorów ze spacjami lub przecinkami na końcu.
Mając to na uwadze, potrzebowaliśmy sposobu na oddzielenie danych, wykluczenie spacji, przycięcie białych znaków i usunięcie danych końcowych. Istnieją różne sposoby użycia samego standardowego COALESCE, ale to nie wystarczyło.
Użyliśmy naszej wypróbowanej i przetestowanej funkcji TextToRows do podzielenia i sortowania tekstu, a następnie zapisaliśmy wartości tekstowe z powrotem w nowy ciąg. Zaletą tego jest to, że dane można ponownie wykorzystać z wybranymi ogranicznikami zarówno dla danych wejściowych, jak i wyjściowych.
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
Dane testowe
Do celów testowych możemy utworzyć tymczasową tabelę i przechowywać kilka adresów. Połącz instrukcję select z funkcją, a zobaczysz, jak zwraca ona wyraźnie sformatowany zestaw danych, który jest idealny do celów wyświetlania.
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
Utrwal dane w tabeli
Ponieważ utworzyliśmy dane za pomocą SCHEMABINDING, możemy również dołączyć je do tabeli jako obliczoną kolumnę.
Należy pamiętać, że ich dodawanie może wpływać na wydajność zapytań, więc generalnie staramy się zachować dane, co w rzeczywistości przechowuje dane w tabeli i jest obliczane tylko na podstawie transakcji wstawiania / aktualizowania.
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