我正在构建一个包含可选参数的查询,其中一些是表值参数。我面临的问题是如何在此查询中最有效地使用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))
这快得多,但我仍觉得它可能不太理想
任何帮助或想法将不胜感激!让我知道我是否可以澄清任何事情......提前致谢
修改
所以,我已经想出了这个,并且可能会使用它,除非有人有更好的解决方案:
INNER JOIN @TVP tvp
ON (tvp.SomeVar = tbl.SomeVar or tvp.SomeVar is null)
答案 0 :(得分: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)