如何使用 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 = 值"传递。 使用"@name = value"形式后,所有后续参数必须以"@name = value"的形式传递。

两件事 -

  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 查询。首先,我们必须用单引号括起所有逗号,这就是 replace 语句所做的,然后我们必须将整个列表与实际的 SQL 语句一起括在大括号中,然后我们最终执行这个动态 SQL 语句以获得所需的输出。要执行该过程,请使用以下代码


exec g_items @im ='pen,mobile'

最新更新