sql – 表值构造函数Select中的最大行数限制

前端之家收集整理的这篇文章主要介绍了sql – 表值构造函数Select中的最大行数限制前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个表值构造函数,通过它可以选择大约100万条记录.它将用于更新另一个表.
SELECT *
FROM   (VALUES (100,200,300),(100,.....
               ..... --1 million records
               (100,300)) tc (proj_d,period_sid,val)

这是我的原始查询https://www.dropbox.com/s/ezomt80hsh36gws/TVC.txt?dl=0#

当我执行上述选择时,它只是显示查询已完成但出现错误显示任何错误消息.

更新:尝试使用TRY / CATCH块捕获错误消息或错误号,但不使用与先前映像相同的错误

BEGIN try
    SELECT *
    FROM   (VALUES (100,.....
                    ..... --1 million records
                    (100,val) 
END try

BEGIN catch
    SELECT Error_number(),Error_message()
END catch

为什么它没有执行,Select中的表Valed构造函数有任何限制.我知道插入它是1000但我在这里选择.

解决方法

没有相关的硬编码限制(65,536 * 4KB的网络数据包大小为268 MB,并且您的脚本长度远不及那个)尽管不建议将此方法用于大量行.

您看到的错误是客户端工具而不是sql Server引发的.如果在动态sql编译中构造sql String,则至少能够成功启动

DECLARE @sql NVARCHAR(MAX) = '(100,';

SELECT @sql = 'SELECT * FROM (VALUES ' + REPLICATE(@sql,1000000) + '
(100,val)';

SELECT @sql AS [processing-instruction(x)]
FOR XML PATH('')

SELECT DATALENGTH(@sql) / 1048576.0 AS [Length in MB] --30.517705917

EXEC(@sql);

虽然我在编译时间约30分钟后杀死了上面的内容但它仍然没有产生一排.文字值需要作为常量表存储在计划本身内,sql Server花费a lot of time试图获取有关它们的属性.

SSMS是一个32位应用程序,并在解析批处理时抛出std :: bad_alloc异常

它尝试将元素推送到已达到容量的令牌向量,并且由于无法获得足够大的连续内存区域而导致其调整大小失败.因此,声明甚至从未使它成为服务器.

载体容量每次增加50%(即在the sequence here之后).向量需要增长的容量取决于代码的布局方式.

以下需要从19到28的容量增长.

SELECT * FROM 
(VALUES 
(100,val)

以下只需要2的大小

SELECT * FROM (VALUES (100,val)

以下需要<>的容量. 63和< = 94.

SELECT *
FROM   (VALUES 
      (100,300)
       ) tc (proj_d,val)

对于按案例1布置的一百万行,向量容量需要增长到3,543,306.

您可能会发现以下任一情况都将允许客户端解析成功.

>减少换行次数.
>重新启动SSMS,希望在地址空间碎片较少时,对大型连续内存的请求成功.

但是,即使您成功将其发送到服务器,它也只会在执行计划生成过程中终止服务器,如上所述.

使用导入导出向导加载表格会更好.如果您必须在Tsql中执行此操作,您会发现将其分成较小的批处理和/或使用其他方法(如shreding XML)将比Table Valued Constructors执行得更好.例如,以下命令在我的机器上执行13秒(尽管如果使用SSMS,您仍然可能需要分成多个批次而不是粘贴大量的XML字符串文字).

DECLARE @S NVARCHAR(MAX) = '<x proj_d="100" period_sid="200" val="300" />
' ; 

DECLARE @Xml XML = REPLICATE(@S,1000000);

SELECT 
    x.value('@proj_d','int'),x.value('@period_sid',x.value('@val','int')
FROM @Xml.nodes('/x') c(x)

猜你在找的MsSQL相关文章