我正在寻找一种方法,在不使用动态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?
答案 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
优化查询。有时UNION
或UNION ALL
会更好。在您的情况下,请先在@ComputerFilter IS NULL
语句中执行IF
检查,如果没有,请执行SELECT
而不是WHERE
...
答案 3 :(得分:0)
你有桌面索引吗?这应该有助于提高绩效。
答案 4 :(得分:0)
对此没有“一刀切”的查询方法,在执行此操作时会产生微妙的性能影响。如果您希望不仅仅是让查询返回正确的答案,无论它有多慢,请查看Dynamic Search Conditions in T-SQLby Erland Sommarskog上的这篇文章