T-SQL بينما حلقة وسلسلة
-
19-08-2019 - |
سؤال
وعندي استفسار SQL التي من المفترض أن تنسحب رقما قياسيا وCONCAT كل لسلسلة، ثم إخراج هذه السلسلة. جزء مهم من الاستعلام أدناه.
DECLARE @counter int;
SET @counter = 1;
DECLARE @tempID varchar(50);
SET @tempID = '';
DECLARE @tempCat varchar(255);
SET @tempCat = '';
DECLARE @tempCatString varchar(5000);
SET @tempCatString = '';
WHILE @counter <= @tempCount
BEGIN
SET @tempID = (
SELECT [Val]
FROM #vals
WHERE [ID] = @counter);
SET @tempCat = (SELECT [Description] FROM [Categories] WHERE [ID] = @tempID);
print @tempCat;
SET @tempCatString = @tempCatString + '<br/>' + @tempCat;
SET @counter = @counter + 1;
END
عند تشغيل البرنامج النصي، والمخرجات @tempCatString
لاغيا في حين دائما إخراج @tempCat
بشكل صحيح. هل هناك سبب أن سلسلة لن تعمل داخل حلقة في حين؟ ويبدو خاطئا، لأن تزايد @counter
يعمل تماما. حتى لا يكون هناك شيء آخر أنا في عداد المفقودين؟
المحلول
ويبدو أنه يجب أن تعمل ولكن لsomereason يبدو أن نفكرtempCatString باطل وهذا هو السبب كنت دائما الحصول على قيمة فارغة كما nullconcatenated إلى أي شيء آخر لا تزال فارغة. أقترح عليك أن تحاول مع COALESCE()
على كل من المتغيرات لمجموعة منهم إلى "" إذا كانت فارغة.
نصائح أخرى
وهذا من شأنه أن يكون أكثر فعالية ....
select @tempCatString = @tempCatString + Coalesce(Description,'') + '<br/>' from Categories...
select @fn
وننظر أيضا في concat_null_yields_null كخيار لحل القضية سلسلة، على الرغم من وأود أن تجنب هذا الطريق
وأنا أتفق مع keithwarren، ولكن سأكون دائما المؤكد أن إضافة جملة ORDER BY إلى الاستعلام. يمكنك أن تكون على يقين من ذلك فيما يتعلق بالضبط ما تأمر يتم متصلا القيم في.
وكما أن تلتحم لاستبدال قيمة NULL مع '' سوف تسفر فعال الصفوف الفارغة. أنا لا أعرف إذا كنت تريد لهم أم لا، ولكن إن لم يكن عليك تصفية في جملة WHERE بدلا من ذلك ...
وأخيرا، يبدو انك لديك جدول مؤقت بما في ذلك معرفات كنت مهتما. يمكن أن يكون مجرد وشمل هذا الجدول في الانضمام لتصفية الجدول المصدر ...
DELCARE @output VARCHAR(8000)
SET @output = ''
SELECT
@output = @output + [Categories].Description + '<br/>'
FROM
Categories
INNER JOIN
#vals
ON #vals.val = [Categories].ID
WHERE
[Categories].Description IS NOT NULL
ORDER BY
[Categories].Description