【问题标题】:Need help to pass multiple values to single parameters in case?需要帮助将多个值传递给单个参数以防万一?
【发布时间】: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


【解决方案1】:

用这个

alter  procedure 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 '1=1'
                      when @param1 like '%%' then 'id in ('+convert(varchar,@param1)+')' end ;
    set @type = case when convert(varchar,@param2)='0' then '1=1'
                      else '@type='+@param2 end ;

    set @xyz = case when convert(varchar,@param3)='0' then '1=1'
                      else '@xyz='+@param3 end ;

    set @name = case when convert(varchar,@param4)='0' then '1=1'
                      else '@name='+@param4 end ;

    set @abc = case when convert(varchar,@param5)='0' then '1=1'
                      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

调用这个sp作为

execute test_1 @param1 = '12,12', @param2 = '0',
     @param3 = '0', @param4 = '0', @param5 = '0'

“In”关键字对“ID =”和“ID in”都有效

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多