如何使用sql过程从单个列传递多个动态值

如何使用sql过程从单个列传递多个动态值,sql,stored-procedures,dynamic,Sql,Stored Procedures,Dynamic,我的示例表: item | id -------+----- mobile | 1 car | 2 pen | 3 我试图创建一个过程,从单个列(item)传递多个动态值,例如:mobile、car等 代码: 错误: 必须以'@name=value'的形式传递参数编号2和后续参数。使用格式'@name=value'后,所有后续参数必须以'@name=value'的形式传递 两件事- 当您编写'exec g_items@im='pen'、'mobile''时,您试图将两个参数传递

我的示例表:

item   | id
-------+-----
mobile | 1
car    | 2
pen    | 3
我试图创建一个过程,从单个列(
item
)传递多个动态值,例如:mobile、car等

代码:

错误:

必须以'@name=value'的形式传递参数编号2和后续参数。使用格式'@name=value'后,所有后续参数必须以'@name=value'的形式传递

两件事-

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

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



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



    用您正在使用的数据库标记您的问题。运行此操作时,我遇到相同的错误。您能告诉我如何执行此过程吗?抱歉,我错过了。您可以使用exec g_items@im='pen,mobile'执行它。我也相应地更新了答案。如果您想传递多个值,还可以检查
    用户定义表
    类型
    create procedure g_items
        @im varchar(25)
    as
        select * 
        from item 
        where item in (@im)
    go
    
    exec g_items @im ='pen','mobile'
    
    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
    
    exec g_items @im ='pen,mobile'