表上的条件Where语句值参数?

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)