无法创建大小为 11616 的行,该行大于允许的最大行大小 8060。使用动态 sql 创建动态列时

问题描述 投票:0回答:1
`-- 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 azure stored-procedures dynamic-sql
1个回答
0
投票

当列的组合大小超过 SQL Server 行大小限制时,您通常会遇到这个问题。在您的情况下,大约 450 个带有 NVARCHAR(100) 的属性每个都会对此做出贡献。

为了解决这个问题,请尝试减小列大小,也许减小到 NVARCHAR(50),以缩小整体行大小。否则,您可以进行垂直分区,例如将表分成具有较少列的较小表。

© www.soinside.com 2019 - 2024. All rights reserved.