Função do SQL Server para concatenar strings
Exibindo texto bem formatado

Esta função nasceu da necessidade de exibir um endereço em uma string bem formatada. Ao trabalhar com esse tipo de dados, geralmente há espaços em branco, valores NULL e, às vezes, texto separado nos campos de dados. A concatenação padrão das colunas gerava delimitadores duplos com espaços em branco ou vírgulas no final.
Com isso em mente, precisávamos de uma maneira de separar os dados, excluindo os espaços em branco, cortando o espaço em branco e removendo os dados finais. Existem várias maneiras de usar o COALESCE padrão sozinho, mas isso não funcionou com os espaços em branco.
Usamos nossa função TextToRows experimentada e testada para dividir e classificar o texto e, em seguida, escrevemos os valores do texto de volta em uma nova string. A vantagem disso é que os dados podem ser reutilizados com delimitadores de sua escolha para entrada e saída.
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
Dados de teste
Para fins de teste, podemos criar uma tabela temporária e armazenar alguns endereços. Combine a instrução select com a função e você pode ver como ela retorna um conjunto de dados formatado de forma nítida que é perfeito para fins de exibição.
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
Persistir os dados na tabela
Conforme criamos os dados com SCHEMABINDING, também podemos anexá-los a uma tabela como uma coluna computada.
Observe que, ao adicioná-los, isso pode afetar o desempenho da consulta, então geralmente tentamos manter os dados persistentes, isso realmente armazena os dados na tabela e é calculado apenas nas transações de inserção / atualização.
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