چسباندن رکورد های دریافتی از یک Query در SQL Server به صورت رشته ای
در بخش انتهایی مقاله زیر بنده در مورد نحوه Split کردن یک رشته در بانک اطلاعاتی SQl Server توضیح دادم :
بنده در این مقاله شرح دادم که به کمک یک تابع که نام آن را FnSplit گذاشتیم چطور می توانیم یک رشته که به وسیله بک کاراکتر جدا کننده (مانند ',') از هم جدا شده اند را به صورت رکورد هایی در یک ستون در آوریم ، این کار کاربرد زیادی در حذف ، ویرایش و دریافت اطلاعات از بانک اطلاعاتی دارد .
حال به نحوه Concatenate (چسباندن) کردن رکورد های بانک اطلاعاتی و نمایش آن به صورت یک رشته Split شده توسط یک کاراکتر جدا ساز می پردازیم :
با یک مثال این ترفند را بیان می کنم ، فرض کنید که یک جدول در بانک اطلاعاتی برای ذخیره اطلاعات کاربران خود دارید و می خواهید با یک Query ایمیل همه این کاربران را دریافت کرده و آن را ذخیره کنید ، احتمالا یک Query به شکل زیر خواهید داشت :
Select Email From TblMembers
پس از اجرای دستور فوق شما ایمیل های کاربران در چندین رکورد دریافت خواهید کرد ، سپس توسط DataReader یا DataSet اطلاعات را در یک حلقه خوانده و در یک فایل متنی ذخیره می کنید .
حال بنده Query فوق را به صورت زیر می نویسم و آن را در یک Sp ذخیره می کنم :
DECLARE @Emails varchar(MAX)
SET @Emails = ''
SELECT @Emails = COALESCE(@Emails + ', ', '') + CAST(Email AS varchar(50))
FROM TBLMembers
SELECT @Emails
در دستور فوق تمامی ایمیل ها توسط کاراکتر ',' به یکدیگر الصاق شده و شما کل ایمیل ها را یکجا و به صورت چسبانده شده می توانید توسط یک ExecuteScaler ساده دریافت کنید .
دستور COALESCE اولین رشته غیر پوچ را بر می گرداند ، بنابراین اگر رشته اول (@Emails + ', ') پوچ باشد به سراغ رشته دوم ('') رفته و آن را بر میگرداند ، در غیر این صورت همان رشته اول بازگردانده می شود ، بنابراین Query فوق را به صورت زیر نیز می توان نوشت :
DECLARE @Emails varchar(MAX)
SET @Emails = ''
SELECT @Emails=CASE @Emails
WHEN '' THEN Email
ELSE @Emails + ', ' + Email
END
FROM TBLMembers
select @Emails;