0

我有以下 SQL

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) 

这是一个更大的 SP 的一部分,它将使用动态 SQL 将这些列插入到数据库中。当然,我已经很久没有使用 SQL 了,但这是基本的,我不知道为什么@PivotColumnHeader会出现空白,或者确实为什么PRINT不起作用(可能是因为变量是空白的!-但是为什么?)-我尝试了正常的声音

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

代替,PRINT但这也没有返回任何内容。我究竟做错了什么?

谢谢你的时间。

4

3 回答 3

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循环将永远不会执行。

于 2013-10-01T17:19:55.030 回答
1

D Stanley 已经给出了关于@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 中的循环,这样,每当我们需要解决问题时,都会想到最后一件事一个问题。

于 2013-10-01T17:28:27.127 回答
0

可能是您打印错误的变量吗?

你有

PRINT @@PivotColumnHeaders;

我想你想要

PRINT @PivotColumnHeaders;

(只有一个“@”)

于 2013-10-01T17:22:32.893 回答