首页 > 解决方案 > 如何使用sql过程从单列传递多个动态值

问题描述

我的样本表:

item   | id
-------+-----
mobile | 1
car    | 2
pen    | 3

我正在尝试创建一个从单列(item)传递多个动态值的过程,例如:移动、汽车等。

代码:

create procedure g_items
    @im varchar(25)
as
    select * 
    from item 
    where item in (@im)
go

exec g_items @im ='pen','mobile'

错误:

必须将参数号 2 和后续参数作为“@name = value”传递。使用“@name = value”形式后,所有后续参数必须以“@name = value”形式传递。

标签: sqlstored-proceduresdynamic

解决方案


两件事情 -

  1. 当您编写' exec g_items @im ='pen','mobile' '时,您试图将两个参数传递给存储过程,其中第二个参数不是@name = @value 对的形式(如第一个@ im = 'pen'),因此出现错误。

  2. 我了解您希望在单个参数中将多个值(值列表)传递给存储过程,以便您可以使用 in 子句查询包含传递给存储过程的列表中的所有值的表。为此,我建议您更改存储过程,如下所示 -


create procedure g_items @im varchar(25)
as
declare @sql nvarchar(max)
set @sql = replace(@im,',',''',''')
set @sql = 'select * from item where item in ('''+@sql+''')'
exec sp_executesql @sql
go

上面的代码将执行动态生成的 SQL 查询。首先,我们必须用单引号将所有逗号括起来,这就是替换语句正在做的事情,然后我们必须将整个列表与实际的 SQL 语句一起括在圆括号中,然后我们最终执行这个动态 SQL 语句以获得所需的输出。要执行该过程,请使用以下代码


exec g_items @im ='pen,mobile'

推荐阅读