我正在构建一个包含一系列可选参数的查询,其中一些参数是表值参数。我面临的问题是如何在这个查询中最有效地使用TVP?
每个TVP的类型为:
TABLE( [variable] nvarchar(30))我知道我通常可以:
INNER JOIN @TVP筛选出任何不在TVP列表中的内容,但是如果我决定在查询中不将任何值传递给TVP,该怎么办?则不会返回任何内容(因为内部连接)。
通常是通过条件where语句:实现的。
WHERE (SomeVar = @SameVar OR @SameVar IS NULL)但是,对于TVP,它不可能是空的(至少我已经找到了)。
我发现实现这一目标的一种方法是:
OUTER APPLY
(SELECT TOP(1) * from dbo.SomeTable tbl where tbl.SomeVar in
(select * from @TVP) or not exists (select * from @TVP)
AND tbl.SomeVar = SomeVar)不幸的是,这种方法太慢了。
或者,我尝试过:
WHERE (tbl.SomeVar in (SELECT * FROM @TVP) or not exists (SELECT * from @TVP))这样做要快得多,但我仍然觉得这不太理想。
任何帮助或想法都将不胜感激!如果我能提前澄清anything....Thanks,请告诉我。
编辑:
因此,我已经想出了这个方法,并且可能会使用它,除非有人有更好的解决方案:
INNER JOIN @TVP tvp
ON (tvp.SomeVar = tbl.SomeVar or tvp.SomeVar is null)发布于 2010-09-22 18:44:12
你试过:
DECLARE @UseTVP int
SET @UseTVP = (SELECT COUNT(*) FROM @TVP)
SELECT TOP 1 *
FROM dbo.SomeTable tbl
LEFT JOIN @TVP tvp
ON tbl.SomeVar = tvp.SomeVar
WHERE (tvp.SomeVar IS NOT NULL
OR @UseTVP = 0)https://stackoverflow.com/questions/3772491
复制相似问题