代码之家  ›  专栏  ›  技术社区  ›  msarchet

帮助破译存储过程

sql
  •  0
  • msarchet  · 技术社区  · 15 年前

    我一辈子都无法弄清楚这个存储过程是如何工作的,或者它究竟在做什么,我知道它是按原样工作的,但是我正在尝试限制一些需要修改这个存储过程的数据库调用。

    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 回复  |  直到 15 年前
        1
  •  1
  •   mdma    15 年前

    注意到它在动态筛选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的匹配项1,因此包含该行。如果不匹配,则返回0,该值不等于1,并且排除该行。

        2
  •  1
  •   Gary    15 年前

    根据可以传递的三个条件从队列中选择值。如果传递的变量@status=-1、或@groupid为空或@macaddress=',则在WHERE条件中不使用它们。如果它们存在,那么它们将在where标准中使用。

    当每个case语句返回1时,将返回队列表中的相应记录。