2

我正在尝试使用以下代码旋转具有 400 个左右唯一值的列:

       Declare @t VARCHAR(10)
       Declare @A VARCHAR(1000)
       Declare @B VARCHAR(1000)
       set @A='SELECT Name, IRIS_ID__c'
       SET @B='('
       SELECT @A=@A+',['+Question_Concept_With_ImpactArea__c+'] as ['+Question_Concept_With_ImpactArea__c+']',@B=@B+'['+Question_Concept_With_ImpactArea__c+']'
       FROM (SELECT DISTINCT Question_Concept_With_ImpactArea__c 
             FROM  Company_Number_Response)  cur
       -- removing last ',' from both variables
       SET @B=SUBSTRING(@B,1,LEN(@B)-1)
       SET @A=@A+ + '    
       FROM 
          (SELECT NAME,  IRIS_ID__c, Selected, Question_Concept_With_ImpactArea__c                           
          FROM Company_Number_Response) s  PIVOT (max(Unified_Response__c) 
          FOR  Question_Concept_With_ImpactArea__c IN ' +@B+')) p ORDER BY [IRIS_ID__c];'
      exec(@A);

运行此代码会引发错误“字符串 'CM_PcCOGSSup' 后的未闭合引号在 'CM_PcCOGSSup' 附近的语法不正确”

当我将最后一个命令从 exec 更改为 print 时,我可以看到正在读取许多值,但该语句只是在上述错误中的值处中断。我检查了数据,没有看到任何会导致这种情况的字符。此外,我认为结果可能太长,并将结果的最大数量更改为 text 为 8192。

任何帮助将不胜感激。

4

2 回答 2

2

假设您使用的是 SQL Server 2005 或更高版本,请将变量声明更改为varchar(max). 它被切断是因为您只提供了varchar(1000),并且字符串连接不会自动延长char数据类型——它们会被截断。

在 SQL 2000 中,您只能使用varchar(8000). 如果你需要更长的时间,你将不得不发挥创造力——这是一项相当艰巨的任务。

你也有SET @A=@A+ + '。如果这行得通,那对我来说是一个惊喜,但无论如何,那里应该只有一个+

而且,您不应该只在列周围放置方括号以使它们成为有效的sysname数据类型。您应该使用以下QuoteName功能:

SELECT @A = @A + ',' + QuoteName(Question_Concept_With_ImpactArea__c) ...
于 2013-06-13T20:07:57.353 回答
1

试试这个——

DECLARE @Columns VARCHAR(MAX)
DECLARE @SQL NVARCHAR(MAX)

SELECT @Columns = STUFF((
    SELECT DISTINCT ', ['+ Question_Concept_With_ImpactArea__c + ']'
    FROM dbo.Company_Number_Response
    FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 2, '')

SELECT @SQL = 'SELECT Name, IRIS_ID__c, ' + @Columns + '     
FROM 
(
    SELECT NAME, IRIS_ID__c, Selected, Question_Concept_With_ImpactArea__c                           
    FROM Company_Number_Response
) s  
PIVOT (
    max(Unified_Response__c) 
    FOR Question_Concept_With_ImpactArea__c IN (' + @Columns + ')
) p 
ORDER BY [IRIS_ID__c];'

EXEC sys.sp_executesql @SQL 
于 2013-06-14T04:57:29.067 回答