2

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

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

我的计划是将其内容复制到表变量中并改用它。

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

我的问题是这是否会导致查询计划中的任何性能受到影响,如果没有,那么 ReadOnly 要求背后的原因是什么?

4

2 回答 2

0

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

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

    或者

  2. 创建一个本地临时表(single #)并将 TVP 数据复制到该表。尽管这样做似乎需要使用 WHERE 子句,但除了以下内容之外,它没有太多价值:

    • 与表变量相比,临时表更好的统计信息(但使用语句级别OPTION (RECOMPILE)解决了这个问题)
    • 添加列的能力
    • 修改 TVP 中已有值的能力
于 2015-02-24T15:46:11.410 回答
0

由于复制表会影响性能,param table 中的行越多,对性能的伤害越大,但如果它可以忽略 sp 的总运行

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

于 2012-01-06T19:13:49.513 回答