2010-06-03 77 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