Funkce serveru SQL pro zřetězení řetězců
Zobrazování dobře formátovaného textu

Tato funkce se zrodila z potřeby zobrazit adresu v dobře formátovaném řetězci. Při práci s tímto druhem dat jsou v datových polích často mezery, hodnoty NULL a někdy i samostatný text. Standardní zřetězení sloupců vedlo k dvojitým oddělovačům s mezerami nebo čárkami na konci.
S ohledem na to jsme potřebovali způsob, jak oddělit data, vyjma mezer, ořezávání mezer a odstranění koncových dat. Samotný standardní COALESCE lze použít různými způsoby, ale s prázdnými místy to nebylo úplně ořezané.
K rozdělení a řazení textu jsme použili naši vyzkoušenou funkci TextToRows a poté jsme textové hodnoty zapsali zpět do nového řetězce. Výhodou je, že data jsou opakovaně použitelná s oddělovači podle vašeho výběru pro vstup i výstup.
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
Testovací data
Pro účely testování můžeme vytvořit dočasnou tabulku a uložit několik adres. Zkombinujte příkaz select s funkcí a uvidíte, jak vrátí ostře naformátovanou datovou sadu, která je ideální pro účely zobrazení.
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
Zachovat data v tabulce
Když jsme data vytvořili pomocí SCHEMABINDING, můžeme je také přidat do tabulky jako vypočítaný sloupec.
Všimněte si, že když je přidáte, může to ovlivnit výkon dotazu, takže se obecně snažíme, aby data zůstala trvalá, ve skutečnosti se data ukládají do tabulky a počítají se pouze u transakcí vložení / aktualizace.
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