وظيفة خادم SQL لسلسلة السلاسل
عرض نص جيد التنسيق
ولدت هذه الوظيفة من الحاجة إلى عرض عنوان في سلسلة منسقة بشكل جيد. عند العمل باستخدام هذا النوع من البيانات ، غالبًا ما توجد فراغات وقيم فارغة وأحيانًا نص منفصل داخل حقول البيانات. أدى التسلسل القياسي للأعمدة إلى محددات مزدوجة بمسافات فارغة أو فواصل في النهاية.
مع وضع ذلك في الاعتبار ، احتجنا إلى طريقة لفصل البيانات ، واستبعاد الفراغات ، وتقليص المساحة البيضاء ، وإزالة البيانات اللاحقة. هناك طرق مختلفة لاستخدام COALESCE القياسي وحده ، لكن هذا لم يقطعها تمامًا مع الفراغات.
استخدمنا وظيفة TextToRows المجربة والمختبرة لتقسيم النص وفرزه ، ثم أعدنا كتابة القيم النصية في سلسلة جديدة. وتتمثل فائدة ذلك في أن البيانات قابلة لإعادة الاستخدام باستخدام محددات من اختيارك لكل من الإدخال والإخراج.
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
بيانات الاختبار
لأغراض الاختبار ، يمكننا إنشاء جدول مؤقت وتخزين عدة عناوين. قم بدمج جملة التحديد مع الوظيفة ويمكنك أن ترى كيف تقوم بإرجاع مجموعة بيانات منسقة بدقة مثالية لأغراض العرض.
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
استمر في البيانات الموجودة في الجدول
نظرًا لأننا أنشأنا البيانات باستخدام SCHEMABINDING ، يمكننا أيضًا إلحاقها بجدول كعمود محسوب.
لاحظ أنه عند إضافة هذه ، يمكن أن يؤثر ذلك على أداء الاستعلام ، لذلك نحاول عمومًا الحفاظ على البيانات مستمرة ، وهذا في الواقع يخزن البيانات في الجدول ، ويتم حسابه فقط على معاملات الإدراج / التحديث.
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