2009-01-16 3 views
1

У меня есть SQL-запрос, который должен вытащить запись и выполнить каждую строку, а затем вывести эту строку. Важная часть запроса приведена ниже.T-SQL while Loop и concatenation

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 работает отлично. Так что-то еще мне не хватает?

ответ

4

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

+0

Одно из значений в таблице я был нулевой поиску информации, поэтому добавление IsNull() к декларации @tempCatString исправили проблему. благодаря – JustinT

3

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

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

select @fn 

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

1

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

Кроме того, COALESCE, чтобы заменить значение 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