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

时间:2010-09-22 18:30:48

标签: sql sql-server sql-server-2008

我正在构建一个包含可选参数的查询,其中一些是表值参数。我面临的问题是如何在此查询中最有效地使用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)

1 个答案:

答案 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)