2010-06-03 71 views
0

我不能为我的生活出此存储过程是如何工作的或它是什么做的正是,我知道它的作品原样,但我想限制哪些需要修改一些这方面的数据库调用存储过程。深入地理解存储过程

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子句,但我不确定做什么。此外,如果有人知道一个工具,可以让我看到实际发生的事情,谢谢!

回答

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

+0

好吧,现在我明白这里发生了什么,谢谢 – msarchet 2010-06-03 16:23:25

1

根据可传递的三个条件从队列中选择值。如果传递的变量@Status = -1或@GroupID为空或@MACAddress ='',则它们不会在Where标准中使用。如果它们存在,那么它们在Where标准中使用。

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

+0

那么究竟得到什么返回到哪里标准,它会像状态= @Status?所以基本上如果状态= 1(例如)它将是Select * From [Queue] Where status = @Status? – msarchet 2010-06-03 16:13:16

+0

没有,如果标准是将 凡(基于CASE语句0或1)(基于CASE语句0或1)和(基于CASE语句0或1) 如果全部为1,那么记录满足在哪里条款。 1 =真0 =假 – Gary 2010-06-03 16:23:03