2011-05-06 329 views
0

我在寫一個參數化存儲過程。我知道你可以設置參數值,以便它在執行命令中沒有提及參數時顯示所有結果。但是我無法回想如何實現這一點。任何幫助,高度讚賞...請..參數化存儲過程

+1

查詢中需要一個條件語句,但不建議在單個查詢中完成 - 不是可靠的。 – 2011-05-06 20:39:54

+0

我認爲有一種方法,您可以將參數的默認值設置爲NULL或什麼,這將讓我執行存儲過程,而無需使用參數..我有道理..我不知道.. – Avinash 2011-05-06 20:42:56

+0

@OMG小馬取決於它是如何寫入的,你可以使用'OPTION RECOMPILE'來增加可用性,不是嗎? – Matthew 2011-05-06 20:45:46

回答

1

你可以讓你WHERE條件是這樣的:

WHERE (@myParam IS NULL OR @myParam = someValue) 

您可以使用OPTION (RECOMPILE)是SQL2008SP1 +(或類似的,不知道其他選項),這取決於你的RDBMS,以獲得這個性能。

從厄蘭Sommarskog方法:
http://www.sommarskog.se/dyn-search-2008.html#static

從鏈接: 「所有的@x的效果是NULL的條款是,如果輸入參數爲NULL,那麼AND條件始終是因此,唯一有效的條件是那些搜索參數具有非NULL值的條件。

只要可維護性得到提高,就很難爲目前的搜索條件想出更好的解決方案。緊湊,易於閱讀和擴展。而且性能非常好只要你包含查詢提示OPTION(RECOMPILE)就可以了。這提示強制每次重新編譯查詢,其中,好像他們是常數的情況下,SQL Server將使用實際變量值。」

+0

你的意思是像創建Proc USP_MyStoreProc這裏@MyParam是NULL – Avinash 2011-05-06 20:47:43

+0

@Avinash我不明白你的評論。我正在談論你如何使用sproc中的參數。 – Matthew 2011-05-06 21:15:27

+0

那麼..它的簡單存儲過程與一個選擇語句,並檢查是否有一列匹配Where子句中的參數。另外,我想顯示所有的結果,如果他們沒有匹配.. – Avinash 2011-05-06 21:20:59

2

我建議參數化的​​動態SQL(sp_executesql

走這條路,你可以建立你的where子句時丟棄任何不相關的參數。

示例程序:

create proc dbo.SearchForStuff 
(
@Id int = 0 
,@Description varchar(100) = '' 
) 
as 
begin 
    set nocount on; 

    declare @select nvarchar(max) = ' 
    select 
    s.* 
    from Stuff as s' 

    declare @where varchar(max) = '' 

    if isnull(@ID,0) != 0 begin     
     set @where += case @where when '' then ' where ' else ' and ' end + 's.Id = @Id'   
    end 

    if isnull(@Description,'') != '' begin  
     set @where += case @where when '' then ' where ' else ' and ' end + 's.[Description] = @Description'  
    end   

    set @select += @where 

    exec sp_executesql 
    @select 
    ,N' 
    ,@Id int = 0 
    ,@Description varchar(100) = ''''' 
    ,@Id 
    ,@Description  

end 

用法:

exec SearchForStuff @Id = 1, @Description = 'omg' -- Returns every item where Id is 1 and Description is 'omg' 
exec SearchForStuff @Id = 1 -- Returns every item where Id is 1 
exec SearchForStuff @Description = 'omg' -- Returns every item where Description is 'omg' 
exec SearchForStuff --returns every item 

以這種方式最終的查詢是不是無用的條件散落。此外,你可以比我在這裏得到更多的粒度。根據哪些參數通過,您可以定製您的where/join子句以利用您的索引,從而獲得最佳性能。唯一的缺點是輕微丟失的可讀性(IMO)。