2013-10-01 6 views
0

У меня есть следующий SQLSQL NVARCHAR Variable Строка Concatenation

DECLARE @ColIdx INT; 
DECLARE @FieldPrefix VARCHAR(50) = N'DX'; 
DECLARE @PivotColumnHeaders NVARCHAR(MAX); 

SELECT @MaxColumnCount = 8; 

WHILE @ColIdx < @MaxColumnCount 
BEGIN 
    SELECT @PivotColumnHeaders = 
    COALESCE(@PivotColumnHeaders + N', 
      [' + @FieldPrefix + CAST(@ColIdx AS VARCHAR) + N'] AS NVARCHAR(100)', 
     N'[' + @FieldPrefix + CAST(@ColIdx AS VARCHAR) + N'] AS NVARCHAR(100)') 
    SET @ColIdx += 1 
END; 

PRINT @@PivotColumnHeaders; 

Я ожидаю, что выход будет

[DX1] AS NVARCHAR(100), [DX2] AS NVARCHAR(100), ..., [DX8] AS NVARCHAR(100) 

и это является частью более крупного СП, который собирается вставить эти столбцы в используя динамический SQL. Конечно, я не использовал SQL в течение многих лет, но это базовое, и я понятия не имею, почему @PivotColumnHeader заканчивается пустым, или действительно почему PRINT не работает (возможно, потому что переменная пуста!), Но почему?) - Я попытался обычно звук

RAISERROR (@PivotColumnHeaders, 10, 1) WITH NOWAIT; 

вместо PRINT но это не также возвращение ничего. Что я делаю неправильно?

Спасибо за ваше время.

+0

Я бы попробовал изменить состав '@ ColIdx' на определенное значение« varchar »(например,« varchar (200) »или что бы это было разумно), вероятно, он усечен и NULLing из окончательного значения' @ PivotColumnHeaders'. –

+0

Хорошо, я понимаю, что это была глупая ошибка. Я возьму это. У меня была долгая неделя, и это только вторник! Спасибо всем за ваше время ... – MoonKnight

ответ

3

Вы не инициализируется @ColIdx:

DECLARE @ColIdx INT; 
DECLARE @FieldPrefix VARCHAR(50) = N'DX'; 
DECLARE @PivotColumnHeaders NVARCHAR(MAX); 
SELECT @MaxColumnCount = 8, @ColIdx = 1; 

По умолчанию значение будет NULL, и, таким образом, @ColIdx < @MaxColumnCount будет NULL, поэтому цикл WHILE никогда не будет выполняться.

0

Может быть, вы печатаете неправильную перемену?

Вы

PRINT @@PivotColumnHeaders; 

И я думаю, что вы хотите

PRINT @PivotColumnHeaders; 

(только сингл "@")

+0

Scratch. См. Ответ @DStanley. Я думаю, он прибил его. – asantaballa

1

D Стэнли уже дал правильный ответ о @ColIdx, не будучи назначил значение, поэтому никогда не входил в цикл. Я просто хотел указать альтернативу, используя цикл для создания этого списка столбцов:

DECLARE @FieldPrefix VARCHAR(50) = N'DX'; 
DECLARE @PivotColumnHeaders NVARCHAR(MAX) = ''; 
DECLARE @MaxColumnCount INT = 8; 

SELECT @PivotColumnHeaders += ', ' + QUOTENAME(@FieldPrefix + CAST(Number AS VARCHAR)) + N' AS NVARCHAR(100)' 
FROM Master..spt_values 
WHERE Type = 'P' 
AND  Number BETWEEN 1 AND @MaxColumnCount; 


PRINT STUFF(@PivotColumnHeaders, 1, 1, ''); 

Я не думаю, что простой цикла, как вы сделали когда-либо будет логически вытекающими производительности, но я просто думаю, что это лучше избегать циклов в SQL, где это возможно, таким образом, это последнее, что приходит в голову, когда нам нужно решить проблему.