我不能为我的生活弄清楚这个存储过程是如何工作的,或者它正在做什么,我知道它的工作原理,但我试图限制一些需要修改这个存储过程的数据库调用。 / p>
CREATE PROCEDURE scriptassist.getQueue
@Status smallint = -1,
@GroupID uniqueidentifier = null,
@MACAddress varchar(200) = ''
AS
SET NOCOUNT ON
Print @GroupID
SELECT *
FROM [Queue]
WHERE
case @Status
When -1 Then
Case When ISNULL(Status,0) <> 1 Then 1 Else 0 End
Else
Case When ISNULL(Status,0) = @Status Then 1 Else 0 End
End =1
And
case When @GroupID IS NULL Then 1
Else
Case When GroupID = @GroupID Then 1 Else 0 End
End =1
And
case @MACAddress
When ''
Then 1
Else
Case When MACAddress = @MACAddress Then 1 Else 0 End
End =1
Order By DateEntered DESC
我知道它不知何故是动态定义Where子句但我不确定要做什么。如果有人知道一个工具可以让我看到实际发生的事情,谢谢!
答案 0 :(得分:1)
根据可传递的三个条件从Queue中选择值。如果传递的变量@ Status = -1,或@GroupID为null,或@MACAddress ='',则它们不在Where条件中使用。如果它们存在,则它们用于Where标准。
当每个case语句返回1时,将返回Queue表中的相应记录。
答案 1 :(得分:1)
您正确地注意到它正在动态过滤WHERE子句。举个例子
case @MACAddress
When ''
Then 1
Else
Case When MACAddress = @MACAddress Then 1 Else 0 End
End =1
如果MACAddress是空字符串,则不用于过滤结果。 (Case语句重写1,然后在结尾处与1进行比较,结果为TRUE,因此包含该行。)
如果@MACAddress参数不是空字符串,则将其与表中的MACAddress列进行比较。如果匹配1,则返回,等于1,因此包含该行。如果没有匹配,则返回0,该值不等于1并排除该行。