Fonction SQL Server pour la concaténation de chaînes
Afficher un texte bien formaté
Cette fonction est née de la nécessité d'afficher une adresse dans une chaîne bien formatée. Lorsque vous travaillez avec ce type de données, il y a souvent des blancs, des valeurs NULL et parfois du texte séparé dans les champs de données. La concaténation standard des colonnes conduit à des doubles délimiteurs avec des espaces vides ou des virgules à la fin.
Dans cet esprit, nous avions besoin d'un moyen de séparer les données, d'exclure les blancs, de rogner les espaces blancs et de supprimer les données de fin. Il existe différentes manières d'utiliser le COALESCE standard seul, mais cela ne l'a pas tout à fait coupé avec les blancs.
Nous avons utilisé notre fonction TextToRows éprouvée pour diviser et trier le texte, puis réécrit les valeurs de texte dans une nouvelle chaîne. L'avantage de ceci est que les données sont réutilisables avec les délimiteurs de votre choix pour l'entrée et la sortie.
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
Données de test
À des fins de test, nous pouvons créer une table temporaire et stocker quelques adresses. Combinez l'instruction select avec la fonction et vous pouvez voir comment elle renvoie un ensemble de données au format net, parfait pour l'affichage.
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
Conserver les données dans le tableau
Lorsque nous avons créé les données avec SCHEMABINDING, nous pouvons également les ajouter à une table en tant que colonne calculée.
Notez que lors de l'ajout de ceux-ci, cela peut avoir un impact sur les performances des requêtes.Nous essayons donc généralement de conserver les données, cela stocke en fait les données dans la table et n'est calculé que sur les transactions d'insertion / mise à jour.
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