Sql server 创建包含多个动态列的透视表时出错

Sql server 创建包含多个动态列的透视表时出错,sql-server,Sql Server,我试着从这个例子中学习 但我收到以下错误: (82938行受影响)Msg 1056,15级,状态1,第1行编号 选择列表中元素的数目超过了允许的最大数目 4096个要素。Msg 102,15级,状态1,第5行语法不正确 在“x”附近 以下是我的SQL: DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX) select @cols = STUFF((SELECT ',' + QUOTENAME(Description)

我试着从这个例子中学习 但我收到以下错误:

(82938行受影响)Msg 1056,15级,状态1,第1行编号 选择列表中元素的数目超过了允许的最大数目 4096个要素。Msg 102,15级,状态1,第5行语法不正确 在“x”附近

以下是我的SQL:

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT ',' + QUOTENAME(Description) 
                    from (Select distinct CompanyID, vchCompanyName as CompanyName, vchPlanDescription as Description, Convert(INT,bitRequiredByMatrix) As Required from tblCompany C
inner join
(Select distinct ContractorID, SUM(decAuditScore) as Score from 
[tblTrainingStandardAudits]
where bitRequiredByMatrix = 1 and TrainingStandardID = 1
Group By ContractorID) CS on CS.ContractorID = C.CompanyID and C.bitActive = 1
Inner Join tblTrainingStandardAuditSummary SAS on SAS.ContractorID = C.CompanyID
Inner join(SELECT distinct [ContractorID],[bitRequiredByMatrix],TP.vchPlanDescription
  FROM [PECV4].[dbo].[tblTrainingStandardAudits] SA
  inner join tblTrainingPlans TP on TP.BitwiseMatrixID = SA.BitwiseMatrixID AND SA.TrainingStandardID = TP.TrainingStandardID where TP.TrainingStandardID=1) RQ on RQ.ContractorID = C.CompanyID)OPP
                    group by Description, CompanyID
                    order by CompanyID
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = N'SELECT ' + @cols + N' from 
             (
                select value, Description
                from (Select distinct CompanyID, vchCompanyName as CompanyName, vchPlanDescription as Description, Convert(INT,bitRequiredByMatrix) As Required from tblCompany C
inner join
(Select distinct ContractorID, SUM(decAuditScore) as Score from 
[tblTrainingStandardAudits]
where bitRequiredByMatrix = 1 and TrainingStandardID = 1
Group By ContractorID) CS on CS.ContractorID = C.CompanyID and C.bitActive = 1
Inner Join tblTrainingStandardAuditSummary SAS on SAS.ContractorID = C.CompanyID
Inner join(SELECT distinct [ContractorID],[bitRequiredByMatrix],TP.vchPlanDescription
  FROM [PECV4].[dbo].[tblTrainingStandardAudits] SA
  inner join tblTrainingPlans TP on TP.BitwiseMatrixID = SA.BitwiseMatrixID AND SA.TrainingStandardID = TP.TrainingStandardID where TP.TrainingStandardID=1) RQ on RQ.ContractorID = C.CompanyID)OPP
            ) x
            pivot 
            (
                max(Required)
                for Description in (' + @cols + N')
            ) p '

exec sp_executesql @query;
我不知道我做错了什么。如果我通过如下方式标记每列来手动创建透视表:

  pivot(max(Required) for Description in ([ASBESTOS MGMT / MAINT WORK],[BENZENE / CHEMICAL EXPOSURE],[FORKLIFT],[NOISE]))pvt

共有2634行。总共有48列,所以我不确定错误中的4096个元素来自哪里。非常感谢您的帮助

Select语句中有太多重复的列。解决方案是使用一个不同的select,它返回一个列名称的不同列表。以下是有效的方法:

    SET @cols = STUFF((SELECT DISTINCT',' + QUOTENAME(Description) 
from (SELECT vchPlanDescription as Description from 
tblTrainingPlans
where TrainingStandardID = 1) cols

            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')
然后,设置查询:

set @query = N'SELECT ' + @cols + N' from 
             (
                select value, Description
                from (Select distinct CompanyID, vchCompanyName as CompanyName, vchPlanDescription as Description, Convert(INT,bitRequiredByMatrix) As Required from tblCompany C
inner join
(Select distinct ContractorID, SUM(decAuditScore) as Score from 
[tblTrainingStandardAudits]
where bitRequiredByMatrix = 1 and TrainingStandardID = 1
Group By ContractorID) CS on CS.ContractorID = C.CompanyID and C.bitActive = 1
Inner Join tblTrainingStandardAuditSummary SAS on SAS.ContractorID = C.CompanyID
Inner join(SELECT distinct [ContractorID],[bitRequiredByMatrix],TP.vchPlanDescription
  FROM [PECV4].[dbo].[tblTrainingStandardAudits] SA
  inner join tblTrainingPlans TP on TP.BitwiseMatrixID = SA.BitwiseMatrixID AND SA.TrainingStandardID = TP.TrainingStandardID where TP.TrainingStandardID=1) RQ on RQ.ContractorID = C.CompanyID)OPP
            ) x
            pivot 
            (
                max(Required)
                for Description in (' + @cols + N')
            ) p '

exec sp_executesql @query;

希望这对其他人有所帮助。

PRINT@cols
检查列数。您使用了
按描述分组,CompanyID
,因此我认为
描述
重复了很多。也许按描述分组是正确的。@Cols对每个公司重复