【发布时间】:2012-03-20 15:52:35
【问题描述】:
我有一个表值类型作为存储过程的参数,其中包含多达数千行的任何内容。我对这个存储过程执行了几个操作(当前是一个 MERGE 和一个 INSERT),但在这些操作之前我想过滤谓词上的参数内容:
@data TableValuedType READONLY
MERGE INTO Table2
USING (
SELECT ... FROM @data
UNION
SELECT ... FROM @data
UNION
...)
ON ...
WHEN NOT MATCHED THEN ....
INSERT INTO Table3
SELECT ... FROM @data
最有效的方法是声明另一个表类型的变量,插入其中,然后使用该变量进行合并和插入:
DECLARE @sanitisedData TableValuedType
INSERT INTO @sanitisedData
SELECT ... FROM @data
WHERE <predicate>
或者每次我从@data中选择一些东西时都使用谓词:
MERGE INTO Table2
USING (
SELECT ... FROM @data WHERE <predicate>
UNION
SELECT ... FROM @data WHERE <predicate>
UNION
...)
ON ...
WHEN NOT MATCHED THEN ....
INSERT INTO Table3
SELECT ... FROM @data WHERE <predicate>
还是别的什么?
【问题讨论】:
-
你不能一开始就传入一组预先过滤的数据吗?
-
不,做过滤的条件只存在于服务器上
-
您是否使用传入的 TVP 进行连接?
-
不是直接的,而是一些select子句被优化器变成了join
-
取决于我认为的情况。要么天平倾向于一个复杂的过滤器,这个过滤器需要永远处理并且会执行很多次。在这种情况下,将结果预先存储在一个新表中并重新使用它。或者,如果过滤器是微不足道的(例如在 @table 的 PK 上)并且要复制的数据量很大,则选择其他选项。
标签: sql sql-server stored-procedures table-valued-parameters