当我使用存储过程选择4个参数时,如何从数据库中检索数据?

时间:2013-07-01 06:15:34

标签: sql-server stored-procedures

我有一个10列的数据库,
让它像A,B,C,D,E,F,G,H,I,J

现在,如果我想提取混合了4个选项的数据 即说B,C,H,J(B是我的主键)
并且没有一个是必须在选项中提供数据 说
情况1:B,C,H作为参数给出,J给出为空

对于所有这些情况,我必须制作一个嵌套的if Else语句?

因为它会转到4! (factorial)= 24 cases

这有什么简单的选择???

2 个答案:

答案 0 :(得分:1)

是。一种选择(但有警告):

   WHERE
       (@paramA IS NULL OR Some Condition involving @paramA) AND
       (@paramB IS NULL OR Some Condition involving @paramB) AND
        ....
       (@paramH IS NULL OR Some Condition involving @paramH)

这样做的警告可能会使您的存储过程对参数嗅探和缓存查询计划敏感,这些计划不适用于特定的参数集。

另一个选择是构造动态TSQL。

正如@ Damien_The_Unbeliever所指出的那样:Erland Sommarskog的Dynamic Search Conditions in SQL是一个很好的起点。

答案 1 :(得分:0)

以下是如何使用动态SQL执行此操作的示例,但我也强烈建议您阅读Mitch和Demien共享的文章。

CREATE PROCEDURE dbo.SearchProc
(
@param1 datetime,
@param2 int,
@param3 nvarchar
)
AS 
BEGIN

DECLARE @sql nvarchar(4000)
DECLARE @parameters nvarchar(300)

SET @sql = 'SELECT * FROM TableName WHERE (1=1) '

if @param1 is not null
SET @sql = @sql + ' AND TableName.Column1 = @param1'

if @param2 is not null
SET @sql = @sql + ' AND TableName.Column2 = @param2'

if @param3 is not null
SET @sql = @sql + ' AND TableName.Column3 = @param3'

SET @parameters = '@param1 datetime, @param2 int, @param3 nvarchar'

EXEC sp_executesql @sql, @parameters, @param1, @param2, @param3

END