Dizeleri birleştirmek için SQL Server İşlevi
İyi biçimlendirilmiş metin görüntüleme
Bu işlev, bir adresi iyi biçimlendirilmiş bir dizede görüntüleme ihtiyacından doğmuştur. Bu tür verilerle çalışırken, veri alanlarında genellikle boşluklar, NULL değerler ve bazen ayrılmış metinler bulunur. Sütunların standart olarak sıralanması, sonunda boşluk veya virgül bulunan çift sınırlayıcılara yol açtı.
Bunu akılda tutarak, boşlukları hariç tutarak, boşlukları kırparak ve sondaki verileri kaldırarak verileri ayırmanın bir yoluna ihtiyacımız vardı. Standart COALESCE'i tek başına kullanmanın çeşitli yolları vardır, ancak bu onu boşluklarla tam olarak kesmedi.
Metni bölmek ve sıralamak için denenmiş ve test edilmiş TextToRows işlevimizi kullandık, ardından metin değerlerini yeni bir dizeye geri yazdık. Bunun yararı, verilerin hem giriş hem de çıkış için seçtiğiniz sınırlayıcılarla yeniden kullanılabilir olmasıdır.
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
Test verisi
Test amacıyla geçici bir tablo oluşturabilir ve birkaç adresi saklayabiliriz. Select deyimini function ile birleştirdiğinizde, görüntüleme amaçları için mükemmel olan, net bir şekilde biçimlendirilmiş bir veri kümesini nasıl döndürdüğünü görebilirsiniz.
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
Tablodaki verilere devam et
Verileri SCHEMABINDING ile oluşturduğumuz için, bir tabloya hesaplanmış bir sütun olarak da ekleyebiliriz.
Bunları eklerken sorgu performansını etkileyebileceğini unutmayın, bu nedenle genellikle verileri kalıcı tutmaya çalışırız, bu aslında verileri tabloda depolar ve yalnızca ekleme/güncelleme işlemlerinde hesaplanır.
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