SQL Server Funzione per concatenare stringhe
Visualizzazione di testo ben formattato
Questa funzione nasce dalla necessità di visualizzare un indirizzo in una stringa ben formattata. Quando si lavora con questo tipo di dati, ci sono spesso spazi vuoti, valori NULL e talvolta testo separato all'interno dei campi dati. La concatenazione standard delle colonne portava a doppi delimitatori con spazi vuoti o virgole alla fine.
Con questo in mente avevamo bisogno di un modo per separare i dati, escludendo gli spazi vuoti, tagliando gli spazi bianchi e rimuovendo i dati finali. Esistono vari modi per utilizzare solo COALESCE standard, ma questo non ha funzionato con gli spazi vuoti.
Abbiamo usato la nostra collaudata funzione TextToRows per dividere e ordinare il testo, quindi abbiamo riscritto i valori del testo in una nuova stringa. Il vantaggio di ciò è che i dati sono riutilizzabili con delimitatori a scelta sia per l'input che per l'output.
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
Dati di test
A scopo di test possiamo creare una tabella temporanea e memorizzare un paio di indirizzi. Combina l'istruzione SELECT con la funzione e puoi vedere come restituisce un set di dati formattato in modo nitido che è perfetto per scopi di visualizzazione.
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
Risultati
Mantieni i dati nella tabella
Poiché abbiamo creato i dati con SCHEMABINDING, possiamo anche aggiungerli a una tabella come colonna calcolata.
Nota, quando li aggiungi, può influire sulle prestazioni della query, quindi generalmente cerchiamo di mantenere i dati persistenti, questo in realtà memorizza i dati nella tabella e viene calcolato solo sulle transazioni di inserimento/aggiornamento.
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