我正在编写参数化存储过程。我知道您可以设置参数值,以便在执行命令中未提及参数时显示所有结果。但我无法回想起如何实现。任何帮助都非常感谢...请.. ..
答案 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,以使其具有高性能。
从链接: “所有@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)