我正在尝试使用以下代码来旋转具有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。
非常感谢任何帮助。
答案 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