【发布时间】:2016-01-21 08:41:39
【问题描述】:
我是动态查询的新手,我陷入了一种情况,即我必须将多个值传递给存储过程的单个参数。但问题是可以有过滤器,也可能没有。
表示该参数可以有 where 子句,也可以没有。
我可以在 where 子句中设置条件,这些条件有时可以为空,或者这些条件会有一些值。
当参数有多个值并且必须在 where 子句中传递时,我被卡住了。
我写了一个小代码,如果过滤器中的值是 0,我可以得到,即没有过滤器用于该特定列和传递单个参数,但我不知道如何传递多个参数。我通过无法使用的 XML 以及我的高级不想增加更多负载的 UDF 寻找它。那么,有没有办法在不使用任何临时表或 UDF 的情况下传递多个参数?
我在这里发布我的代码:
alter procedure db.test_1
(@param1 varchar(10), @param2 varchar(10),
@param3 varchar(10), @param4 varchar(10), @param5 varchar(10))
as
begin
declare @id varchar(250)
declare @type varchar(250)
declare @xyz varchar(250)
declare @name varchar(250)
declare @abc varchar(250)
declare @sql varchar(800)
set @id = case when convert(varchar,@param1)='0' then ''
when @param1 like '%%' then 'id in ('+convert(varchar,@param)+')'
else 'id='+@param1 end ;
set @type = case when convert(varchar,@param2)='0' then ''
else '@type='+@param2 end ;
set @xyz = case when convert(varchar,@param3)='0' then ''
else '@xyz='+@param3 end ;
set @name = case when convert(varchar,@param4)='0' then ''
else '@name='+@param4 end ;
set @abc = case when convert(varchar,@param5)='0' then ''
else '@abc='+@param5 end ;
set @sql = 'select sum(column_1) from db.test_1 where '+@id+'and'+@type+'and'+@xyz+'and'+@name+'and'+ @abc
select @sql; -- to know what query is running
--execute(@sql)
end
我在这里需要帮助:
case when convert(varchar,@param1)='0' then ''
when @param1 like '%%' then 'carrier_id in ('+convert(varchar,@param)+')'
else 'id='+@param1 end ;
我怎么知道'%%'的意思是有多个参数正在传递
欢迎您的任何帮助,如果您有任何不明白的地方,请发表评论?
【问题讨论】:
-
LIKE '%%'表示所有参数NOT NULL都可以通过 -
这意味着 multiplr 值可以通过单个参数,例如执行 db.test_1 '23,26,27','23' 等...这是我遇到的问题,我该如何告诉编译器我们正在传递多个值。是的,不仅仅是 null
-
为什么要到处转换? @paramX 是 varchar。您不需要将它们转换为 varchar。如果你这样做,添加正确的长度,不要单独使用 varchar,使用 varchar(X)。
-
是的,你是对的,我不需要转换谢谢
标签: sql-server sql-server-2008 stored-procedures parameter-passing