T-SQL, пока цикл и конкатенация
-
19-08-2019 - |
Вопрос
У меня есть 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
работает отлично. Так что-то еще мне не хватает?
Решение
Похоже, что это должно работать, но по какой-то причине кажется, что @tempCatString имеет значение null, поэтому вы всегда получаете нулевое значение, так как null, связанный с чем-то еще, по-прежнему равно null. Предлагаем вам попробовать с помощью COALESCE()
каждой из переменных установить для них значение & Quot; & Quot; если они нулевые.
Другие советы
это было бы более эффективно ....
select @tempCatString = @tempCatString + Coalesce(Description,'') + '<br/>' from Categories...
select @fn
также посмотрите на concat_null_yields_null как на вариант, чтобы исправить вашу проблему конкатенации, хотя я бы избежал этого маршрута
Я согласен с 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