T-SQL:普通SQL语句中的Dynamic Where子句

时间:2010-03-24 14:13:26

标签: tsql

我正在寻找一种方法,在不使用动态SQL的情况下动态地将过滤器添加到我的参数中。

我想从表中选择所有计算机,但是当我将计算机ID传递给sp时,我只想获得这台计算机。

其实我试试

DECLARE @ComputerFilter AS INT
DECLARE @ComputerID AS INT

SELECT Computername 
FROM   Computer
WHERE  (ComputerID = @ComputerID) OR (@ComputerFilter IS NULL))

但这比这个判断慢100倍,并且只需要SELECT * FROM Computer

SELECT Computername 
FROM   Computer
WHERE  ComputerID = @ComputerID

有没有办法加速这个语句或有没有其他方法来解决这个问题,一个选择和没有动态的SQL?

5 个答案:

答案 0 :(得分:4)

最简单的方法是使用IF语句。

IF @ComputerID IS NULL BEGIN
  SELECT Computername 
  FROM   Computer
END
ELSE BEGIN
  SELECT Computername 
  FROM   Computer
  WHERE  ComputerID = @ComputerID
END

答案 1 :(得分:1)

DECLARE @ComputerID AS INT

SET @ComputerID  = null -- fro all null or just id for one

SELECT Computername 
FROM   Computer
WHERE  ComputerID = ISNULL( @ComputerID, ComputerID  )

当你不需要时

答案 2 :(得分:0)

SQL Server通常不善于使用OR子句中的WHERE优化查询。有时UNIONUNION ALL会更好。在您的情况下,请先在@ComputerFilter IS NULL语句中执行IF检查,如果没有,请执行SELECT而不是WHERE ...

答案 3 :(得分:0)

你有桌面索引吗?这应该有助于提高绩效。

答案 4 :(得分:0)

对此没有“一刀切”的查询方法,在执行此操作时会产生微妙的性能影响。如果您希望不仅仅是让查询返回正确的答案,无论它有多慢,请查看Dynamic Search Conditions in T-SQLby Erland Sommarskog上的这篇文章