如何向带有sparse column_set的宽表插入数据并解决列数超限报错
问题原因
你遇到的报错核心是两个问题叠加导致的:
- 你使用了
SELECT ... INTO语法,该语法会忽略你已手动创建的ExcelTestReport表,直接根据查询结果的列结构自动创建新表。自动创建的表默认不会给字段加SPARSE属性,也不会携带你定义的COLUMN_SET,普通表的列数上限就是1024,超过就会触发报错。 - 你写的动态SQL开头的
SELECT后多了一个多余的逗号,本身就存在语法错误。
解决方案
第一步:放弃SELECT INTO,改用INSERT INTO ... SELECT结构
你已经提前创建好了带SPARSE和COLUMN_SET的表(该结构支持最多30000列,远高于普通表上限),直接往已有的表插入数据即可,不要让SQL自动建表。
第二步:调整动态SQL语句
如果@cols对应的所有稀疏列已经提前添加到ExcelTestReport表中,修改后的动态SQL如下:
SET @query ='INSERT INTO [Repoting].[dbo].[ExcelTestReport] (Product, Pdesc, ' + @cols + ') SELECT Product, Pdesc, ' + @cols + ' From ( Select Product ,Pdesc , value , col from #ResultDetailsPIVOT )x pivot ( max(value) for col in (' + @cols + ') ) p ' Print(@query) EXECUTE(@query)
第三步:动态添加稀疏列(如果列是动态生成的)
如果@cols里的列是动态生成的,没有提前加到表中,可以先执行以下动态语句批量添加SPARSE列,再执行上面的插入语句:
DECLARE @addColSql NVARCHAR(MAX) = '' SELECT @addColSql = @addColSql + 'ALTER TABLE [Repoting].[dbo].[ExcelTestReport] ADD [' + TRIM(value) + '] VARCHAR(50) SPARSE NULL; ' FROM STRING_SPLIT(@cols, ',') EXEC(@addColSql)
额外注意
自增主键Id不需要在插入语句中指定,SQL Server会自动生成值。
内容的提问来源于stack exchange,提问作者Shadab Ahmad
相关产品推荐
相关产品推荐

