`-- Generate dynamic column list
SET @cols = STUFF((SELECT DISTINCT ',' + QUOTENAME(Attribute)
FROM AttributeValue
WHERE ProjectID = @ProjectId
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '');
-- Define data types for the columns
DECLARE @columnDefinitions NVARCHAR(MAX);
SET @columnDefinitions = STUFF((SELECT DISTINCT ',' + QUOTENAME(Attribute) + ' NVARCHAR(100)'
FROM AttributeValue
WHERE ProjectID = @ProjectId
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '');
SET @createTableQuery = 'CREATE TABLE ##Attributes (AssetItemID INT, ' + @columnDefinitions + ');';
SET @query =
'INSERT INTO ##Attributes
SELECT AssetItemID, ' + @cols + '
FROM (
SELECT i.AssetItemID, av.Attribute, i.Value
FROM Item2Item i
INNER JOIN AttributeValue av ON av.AttributeValueID = i.SubTypeAttributeID
INNER JOIN AssetItem (NOLOCK) a ON a.AssetItemID = i.AssetItemID
WHERE av.ProjectID = ' +CAST(@ProjectId AS VARCHAR(10))+'
AND a.Owner = '+ QUOTENAME(@Package,'''') +'
) src
PIVOT (
MAX(Value) FOR [Attribute] IN (' + @cols + ')
) AS piv;';`
我尝试在将列定义为 NVARCHAR(1) 时设置 columnDefinitions,但无法使用大约 450 个属性,但仍将行大小指定为大
当列的组合大小超过 SQL Server 行大小限制时,您通常会遇到这个问题。在您的情况下,大约 450 个带有 NVARCHAR(100) 的属性每个都会对此做出贡献。
为了解决这个问题,请尝试减小列大小,也许减小到 NVARCHAR(50),以缩小整体行大小。否则,您可以进行垂直分区,例如将表分成具有较少列的较小表。