表值参数只读解决方案



我有一个SProc,它具有dbo.SectionIn类型的表值参数@section。这个参数在整个SProc中都在使用,我想从中删除一些记录,但它当然是只读的。

The table-valued parameter "@sections" is READONLY and cannot be modified.

我的计划是将其内容复制到表变量中,然后使用它。

DECLARE @sectionDups as dbo.SectionIn
    INSERT INTO @sectionDups
    SELECT *
    FROM @sections 

我的问题是,这会对查询计划的性能造成影响吗?如果不会,ReadOnly要求背后的原因是什么?

由于复制表,性能会受到影响,param表中的行越多,对性能的影响就越大,但如果它对sp 的总运行量可以忽略不计

AFAIK只读tvp的唯一原因是-因为它是sql server中非常新的功能,读写仍在构建中,所以-请耐心等待

不应将TVP表变量复制到新的表变量中。如果要排除行,请执行以下操作之一:

  1. 使用WHERE子句过滤掉不需要的行。

  2. 创建一个本地临时表(单个#),并将TVP数据复制到其中。尽管这样做似乎需要使用WHERE子句,所以这在之外没有太多价值

    • 与表变量相比,临时表的统计信息更好(但使用语句级OPTION (RECOMPILE)可以解决这个问题)
    • 添加列的能力
    • 修改TVP中已有值的能力

最新更新