参数化存储过程

时间:2011-05-06 20:37:50

标签: tsql stored-procedures

我正在编写参数化存储过程。我知道您可以设置参数值,以便在执行命令中未提及参数时显示所有结果。但我无法回想起如何实现。任何帮助都非常感谢...请.. ..

3 个答案:

答案 0 :(得分: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 :(得分:1)

您可以按照以下条件制定WHERE条件:

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

您可以在sproc中使用OPTION (RECOMPILE) SQL2008SP1 +(或类似的,不知道其他选项),具体取决于您的RDBMS,以使其具有高性能。

来自Erland Sommarskog的方法:
http://www.sommarskog.se/dyn-search-2008.html#static

从链接: “所有@x IS NULL子句的效果是,如果该输入参数为NULL,则该AND条件始终为true。因此,唯一有效的条件是搜索参数具有非NULL值的条件

就可维护性而言,很难为手头的搜索条件考虑更好的解决方案。它结构紧凑,易于阅读和扩展。和表现?只要包含查询提示OPTION(RECOMPILE),就非常好。此提示强制每次重新编译查询,在这种情况下,SQL Server将使用实际变量值,就像它们是常量一样。“

答案 2 :(得分:1)

如果是int,您可以使用

SELECT X,Y
FROM T
WHERE C BETWEEN COALESCE(@P, -2147483648) AND COALESCE(@P, 2147483647)

The definitive article on the subject