【问题标题】:SQL OR clause to not read every row in tableSQL OR 子句不读取表中的每一行
【发布时间】:2014-10-09 21:16:54
【问题描述】:

在 where 子句中是否有更好的方法来执行以下类型的 OR 条件

WHERE (@TestID IS NULL OR t.[ID] = @TestID)

我遇到的问题是不同变量的 WHERE 子句中有很多这样的变量,这会导致大量数字或读取。我想要完成的是,如果参数为 NULL,则不要评估它,如果它不是 NULL,则评估它。到目前为止,我想出的唯一解决方案是将它们分解为巨大的查询,检查填充的内容并像这样定制查询:

IF @TestID IS NOT NULL
....

ELSE IF @TestID IS NULL
....

这变得极其繁琐,并且由于变量众多而难以维护。

【问题讨论】:

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


【解决方案1】:

如果您有很多这样的情况,则可能是动态 SQL 的情况,因为这种搜索模式容易出现参数嗅探问题。

create proc dbo.MySearch @col1 int, @col2 varchar(30) as

declare @sql nvarchar(max), @params nvarchar(max);
set @sql = 'select col1, col2 from dbo.Table where 1 = 1';
set @params = '@col1 int, @col2 varchar(30)';

if @col1 is not null set @sql += 'and Col1 = @col1';
if @col2 is not null set @sql += 'and Col2 = @col2';

exec sp_executesql @sql, @params, @col1, @col2;

不过,管理复杂性的真正方法是编写一个程序来生成存储过程!

【讨论】:

    【解决方案2】:
    Where ISNULL(t.[ID], @TestId) = @TestId
    

    这将检索所有空值以及与您的TestId匹配的值

    【讨论】:

      猜你喜欢
      • 2015-09-12
      • 1970-01-01
      • 2011-03-05
      • 1970-01-01
      • 2014-07-08
      • 1970-01-01
      • 1970-01-01
      • 2011-08-23
      • 1970-01-01
      相关资源
      最近更新 更多