sql - 如何使用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”形式传递。
解决方案
两件事情 -
当您编写' exec g_items @im ='pen','mobile' '时,您试图将两个参数传递给存储过程,其中第二个参数不是@name = @value 对的形式(如第一个@ im = 'pen'),因此出现错误。
我了解您希望在单个参数中将多个值(值列表)传递给存储过程,以便您可以使用 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'
推荐阅读
- javascript - 在反应中映射图像但不渲染
- python - 如何将 MP3 文件“转换”为 numpy 数组或列表
- office-js - 替换范围中的第一个单词会导致从 word office js 中的范围中省略该单词
- json - 在 Google Data Studio 中提取 json 字符串字段
- javascript - Chart.js - 使用时刻时无法看到悬停工具提示
- data-structures - 如果我们有一些二叉搜索树并执行 add(x) 和 remove(x) 操作,我们是否一定要返回原始树?
- python - 如何在python中存储具有后缀零的所需精度的十进制数?
- javascript - 是否有保证在特定时间间隔运行计时器的方法?
- python - 根据动态条件标记数据框中的行
- python - 你能解决python_3属性错误吗