Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用exec命令切断动态SQL语句时出错_Sql_Sql Server_Dynamic_Pivot - Fatal编程技术网

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

使用exec命令切断动态SQL语句时出错,sql,sql-server,dynamic,pivot,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 ['+

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


如果您使用的是SQL Server 2005或更高版本,请将变量声明更改为
varchar(max)
。由于您只提供了
varchar(1000)
,字符串连接不会自动延长
char
数据类型,因此会被截断

在SQL 2000中,您只能使用
varchar(8000)
。如果您需要更长的时间,您将不得不进行创造性的工作,这是一项相当困难的任务

你也有
设置@A=@A++'
。如果这样做有效,我会感到惊讶,但无论如何,那里应该只有一个
+

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

SELECT @A = @A + ',' + QuoteName(Question_Concept_With_ImpactArea__c) ...
试试这个-

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 

什么版本的SQL Server?