使用exec命令切断动态SQL语句时出错

时间:2013-06-13 20:00:34

标签: sql sql-server dynamic pivot

我正在尝试使用以下代码来旋转具有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时,我可以看到正在读取许多值,但该语句只是切断了上述错误中的值。我检查了数据,但没有看到任何可能导致此问题的字符。另外,我认为结果可能太长,并将结果的最大数字更改为8192。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分: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) ...

答案 1 :(得分: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