【问题标题】:Error with Dynamic SQL statement cutting off with exec command使用 exec 命令切断动态 SQL 语句时出错
【发布时间】:2013-06-13 20:00:33
【问题描述】:

我正在尝试使用以下代码旋转具有 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。

任何帮助将不胜感激。

【问题讨论】:

  • 什么版本的 SQL Server?

标签: sql sql-server dynamic pivot


【解决方案1】:

假设您使用的是 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) ...

【讨论】:

    【解决方案2】:

    试试这个 -

    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 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-24
      • 1970-01-01
      • 1970-01-01
      • 2011-06-26
      • 2021-04-07
      • 2017-08-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多