Вопрос

У меня есть 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top