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

Sql server 当我可以选择使用存储过程的4个参数时,如何从数据库中检索数据?,sql-server,stored-procedures,Sql Server,Stored Procedures,我有一个10列的数据库, 让它像A,B,C,D,E,F,G,H,I,J 现在,如果我想混合使用4个选项提取数据 i、 e说B,C,H,J(B是我的主键) 并且这些选项中没有一个是必须在选项中提供数据的。 说 情况1:B,C,H作为参数给出,而J为空 对于所有这些情况,我必须做一个嵌套的if-Else语句 因为它会变成4!(阶乘)=24例 有什么简单的选择吗?有。一种选择(但需注意): 需要注意的是,这可能会使您的存储过程对参数嗅探和缓存的查询计划非常敏感,这些计划不适合于特定的参数集 另一种选择

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

现在,如果我想混合使用4个选项提取数据
i、 e说
B,C,H,J
(B是我的主键)
并且这些选项中没有一个是必须在选项中提供数据的。

情况1:
B,C,H
作为参数给出,而
J
为空

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

因为它会变成
4!(阶乘)=24例

有什么简单的选择吗?

有。一种选择(但需注意):

需要注意的是,这可能会使您的存储过程对参数嗅探和缓存的查询计划非常敏感,这些计划不适合于特定的参数集

另一种选择是构造动态TSQL


正如@Damien_The_unsiver所指出的:Erland Sommarskog's是一个很好的起点。

这里有一个关于如何使用动态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
埃尔兰·索马斯科格酒店将是人们通常去的地方
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