Función de SQL Server para concatenar cadenas
Visualización de texto bien formateado
Esta función nació de la necesidad de mostrar una dirección en una cadena bien formateada. Cuando se trabaja con este tipo de datos, a menudo hay espacios en blanco, valores NULL y, a veces, texto separado dentro de los campos de datos. La concatenación estándar de las columnas dio lugar a delimitadores dobles con espacios en blanco o comas al final.
Teniendo esto en cuenta, necesitábamos una forma de separar los datos, excluir los espacios en blanco, recortar los espacios en blanco y eliminar los datos finales. Hay varias formas de usar COALESCE estándar solo, pero eso no fue suficiente con los espacios en blanco.
Usamos nuestra función TextToRows probada y probada para dividir y ordenar el texto, luego escribimos los valores de texto nuevamente en una nueva cadena. El beneficio de esto es que los datos se pueden reutilizar con delimitadores de su elección tanto para la entrada como para la salida.
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
Datos de prueba
Con fines de prueba, podemos crear una tabla temporal y almacenar un par de direcciones. Combine la instrucción de selección con la función y podrá ver cómo devuelve un conjunto de datos con un formato nítido que es perfecto para fines de visualización.
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
Conservar los datos en la tabla
Como creamos los datos con SCHEMABINDING, también podemos agregarlos a una tabla como una columna calculada.
Tenga en cuenta que, al agregarlos, puede afectar el rendimiento de la consulta, por lo que generalmente intentamos mantener los datos persistentes, esto en realidad almacena los datos en la tabla y solo se calcula en las transacciones de inserción / actualización.
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