我在寫一個參數化存儲過程。我知道你可以設置參數值,以便它在執行命令中沒有提及參數時顯示所有結果。但是我無法回想如何實現這一點。任何幫助,高度讚賞...請..參數化存儲過程
Q
參數化存儲過程
0
A
回答
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將使用實際變量值。」
1
如果它是一個int
可以使用
SELECT X,Y
FROM T
WHERE C BETWEEN COALESCE(@P, -2147483648) AND COALESCE(@P, 2147483647)
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)。
相關問題
- 1. VB.net中的參數化存儲過程
- 2. SQL Server:參數化存儲過程
- 3. Oracle存儲過程結構化參數
- 4. 參數化的存儲過程錯誤
- 5. 存儲過程NULL參數
- 6. 存儲過程的參數
- 7. DbNull.Value存儲過程參數?
- 8. 存儲過程,空參數
- 9. 存儲過程與參數
- 10. MySQL存儲過程參數
- 11. 存儲過程與參數
- 12. 在存儲過程參數
- 13. 存儲過程在參數
- 14. 在存儲過程中執行帶參數的存儲過程
- 15. 通過存儲過程傳遞參數
- 16. 通過存儲過程訂購參數
- 17. 存儲過程數組參數
- 18. PostgreSQL存儲過程數據參數
- 19. 將參數從存儲過程傳遞給函數(在存儲過程中)
- 20. 參數化在存儲過程中選擇查詢?
- 21. 在OpenQuery中調用參數化存儲過程 - SQL Server 2008
- 22. 初始化存儲過程的輸出參數
- 23. 未知列在字段列表,參數化存儲過程
- 24. 如何在ADO.NET中使用MS Access參數化存儲過程?
- 25. PHP SQLSRV參數化存儲過程的T-SQL語法
- 26. 沒有存儲過程的參數化查詢?
- 27. 最小化MySQL存儲過程中的參數
- 28. 如何在C#中調用參數化存儲過程(ASP.Net)?
- 29. Hana參數化存儲過程問題簡單的jdbc模板
- 30. executenonquery調用參數化存儲過程沒有響應
查詢中需要一個條件語句,但不建議在單個查詢中完成 - 不是可靠的。 – 2011-05-06 20:39:54
我認爲有一種方法,您可以將參數的默認值設置爲NULL或什麼,這將讓我執行存儲過程,而無需使用參數..我有道理..我不知道.. – Avinash 2011-05-06 20:42:56
@OMG小馬取決於它是如何寫入的,你可以使用'OPTION RECOMPILE'來增加可用性,不是嗎? – Matthew 2011-05-06 20:45:46