Tsql 参数化存储过程

Tsql 参数化存储过程,tsql,stored-procedures,Tsql,Stored Procedures,我正在写一个参数化的存储过程。我知道您可以设置参数值,以便在execute命令中未提及该参数时显示所有结果。。但我想不起来这是如何实现的。非常感谢您的帮助。。。请 您可以使您的WHERE条件如下: WHERE (@myParam IS NULL OR @myParam = someValue) 您可以在存储过程中使用选项(重新编译)is SQL2008SP1+(或类似的,不知道其他选项),具体取决于您的RDBMS,以实现此功能 来自Erland Sommarskog的方法: 从链接中: “所

我正在写一个参数化的存储过程。我知道您可以设置参数值,以便在execute命令中未提及该参数时显示所有结果。。但我想不起来这是如何实现的。非常感谢您的帮助。。。请

您可以使您的
WHERE
条件如下:

WHERE (@myParam IS NULL OR @myParam = someValue)
您可以在存储过程中使用
选项(重新编译)
is SQL2008SP1+(或类似的,不知道其他选项),具体取决于您的RDBMS,以实现此功能

来自Erland Sommarskog的方法:

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


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

您可以使
WHERE
条件如下:

WHERE (@myParam IS NULL OR @myParam = someValue)
您可以在存储过程中使用
选项(重新编译)
is SQL2008SP1+(或类似的,不知道其他选项),具体取决于您的RDBMS,以实现此功能

来自Erland Sommarskog的方法:

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


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

如果它是
int
,则可以使用

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

如果它是
int
,您可以使用

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

我建议使用参数化动态sql()

按照这种方式,在构建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)。

我建议使用参数化动态sql()

按照这种方式,在构建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)。

查询中需要一个条件语句,但不建议在单个查询中执行它——这不是sargable。我认为有一种方法可以将参数的默认值设置为NULL,或者让我在不使用参数的情况下执行存储过程。。我说得通吗。。我不知道。@OMG Ponies根据它的编写方式,您可以使用
选项重新编译
,使其可搜索,否?请参阅Gail Shaw的博客文章。@OMG Ponies滚动到静态SQL部分,找到“SQL Server将使用实际变量值,就像它们是常量一样。”查询中需要一个条件语句,但不建议在单个查询中执行此操作,因为这不是sargable。我认为有一种方法可以将参数的默认值设置为NULL,或者让我在不使用参数的情况下执行存储过程。。我说得通吗。。我不知道。@OMG Ponies根据它的编写方式,您可以使用
选项重新编译
,使其可移植,否?请参阅Gail Shaw的博客文章。@OMG Ponies滚动到静态SQL部分,找到“SQL Server将使用实际变量值,就像它们是常量一样。”你的意思是像Create Proc USP_MyStoreProc,其中@MyParam是NULL@Avinash我不明白你的评论。我说的是如何在存储过程中使用参数。。它的简单存储过程使用select语句,并检查其中一列是否与Where子句中的参数匹配。此外,如果没有匹配的结果,我想显示所有结果。@Avinash为什么不在问题中发布select,我会尝试为您调整它?您的意思是创建Proc USP_MyStoreProc,其中@MyParam是NULL@Avinash我不明白你的评论。我说的是如何在存储过程中使用参数。。它的简单存储过程使用select语句,并检查其中一列是否与Where子句中的参数匹配。此外,如果没有匹配的结果,我想显示所有结果。@Avinash为什么不在问题中发布选择,我会尝试为您调整它?