帮助解密存储过程

时间:2010-06-03 16:00:46

标签: sql

我不能为我的生活弄清楚这个存储过程是如何工作的,或者它正在做什么,我知道它的工作原理,但我试图限制一些需要修改这个存储过程的数据库调用。 / 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子句但我不确定要做什么。如果有人知道一个工具可以让我看到实际发生的事情,谢谢!

2 个答案:

答案 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并排除该行。