表值参数ReadOnly Work-Around

时间:2012-01-06 18:55:35

标签: sql-server-2008 table-valued-parameters

我有一个带有表值参数的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要求背后的原因是什么?

2 个答案:

答案 0 :(得分:0)

由于复制表会导致性能下降,param表中的行越多,它对性能的影响越大,但是如果它对sp的总运行可以忽略不计

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

答案 1 :(得分:0)

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

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

  2. 创建一个本地临时表(单#)并将TVP数据复制到该表。虽然这样做似乎需要使用WHERE子句,所以这里没有很多值:

    • 更好的临时表统计信息而不是表变量(但使用语句级OPTION (RECOMPILE)解决了一个问题)
    • 添加列的能力
    • 修改TVP中已有值的功能