Bre*_*ett 9 sql sql-server sql-server-2008
我正在构建一个包含可选参数的查询,其中一些是表值参数.我面临的问题是如何在此查询中最有效地使用TVP?
每个TVP都有这种类型:
TABLE( [variable] nvarchar(30))
Run Code Online (Sandbox Code Playgroud)
我知道我通常可以:
INNER JOIN @TVP
Run Code Online (Sandbox Code Playgroud)
过滤掉TVP列表中没有的任何内容,但如果我决定不在查询中将任何值传递给TVP,该怎么办?然后什么都不会返回(因为内连接)
通常这是通过条件where语句完成的:
WHERE (SomeVar = @SameVar OR @SameVar IS NULL)
Run Code Online (Sandbox Code Playgroud)
但是,对于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)
Run Code Online (Sandbox Code Playgroud)
不幸的是,这种方法非常慢
或者,我试过:
WHERE (tbl.SomeVar in (SELECT * FROM @TVP) or not exists (SELECT * from @TVP))
Run Code Online (Sandbox Code Playgroud)
这要快得多,但我仍觉得它可能不太理想
任何帮助或想法将不胜感激!让我知道我是否可以澄清任何事情......提前致谢
编辑:
所以,我已经想出了这个,并且可能会使用它,除非有人有更好的解决方案:
INNER JOIN @TVP tvp
ON (tvp.SomeVar = tbl.SomeVar or tvp.SomeVar is null)
Run Code Online (Sandbox Code Playgroud)
Joe*_*lli 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)
Run Code Online (Sandbox Code Playgroud)