T-SQL, пока цикл и конкатенация - PullRequest
1 голос
/ 16 января 2009

У меня есть SQL-запрос, который должен извлечь запись и объединить каждый в строку, а затем вывести эту строку. Важная часть запроса приведена ниже.

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 всегда выводит правильно. Есть ли какая-то причина, по которой конкатенация не будет работать в цикле while? Это кажется неправильным, поскольку увеличение @counter работает отлично. Так что-то еще мне не хватает?

Ответы [ 3 ]

4 голосов
/ 16 января 2009

Похоже, что это должно работать, но по какой-то причине кажется, что @tempCatString имеет значение null, поэтому вы всегда получаете нулевое значение, так как null, связанный с чем-либо еще, все еще равно null. Предлагаем вам попробовать с COALESCE() для каждой из переменных установить их в "", если они равны нулю.

3 голосов
/ 16 января 2009

это было бы более эффективно ....

select @tempCatString = @tempCatString + Coalesce(Description,'') + '<br/>' from Categories...

select @fn

также посмотрите на concat_null_yields_null как вариант, чтобы исправить вашу проблему конкатенации, хотя я бы избежал этого маршрута

1 голос
/ 18 января 2009

Я согласен с keithwarren, но всегда буду добавлять предложение ORDER BY в запрос. Затем вы можете быть уверены в том, в каком порядке объединяются значения.

Кроме того, COALESCE для замены значения NULL на '' будет эффективно давать пустые строки. Я не знаю, хотите вы их или нет, но если вместо этого просто отфильтруйте в предложении WHERE ...

Наконец, у вас, похоже, есть временная таблица с интересующими вас идентификаторами. Эта таблица может быть просто включена в JOIN для фильтрации исходной таблицы ...

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
...