SQL—通过存储过程传递表变量
假设我有一个存储过程:SQL—通过存储过程传递表变量,sql,sql-server,tsql,stored-procedures,Sql,Sql Server,Tsql,Stored Procedures,假设我有一个存储过程: exec my_sp ?,? 我可以通过添加两个值来执行此存储过程,例如 exec my_sp 'value 1','value 2' 这就是事情变得棘手的地方 例如,我有一张桌子 1 | 2 aa bb cc dd 等等 现在我想传递我的表值并创建一个结果表,例如 exec my_sp 'aa','bb' exec my_sp 'cc','dd' 等等 如何实现这一点?我建议您修改您的过程,接受表类型作为输入参数,而不是变量 然后可以在一次快照中将
exec my_sp ?,?
我可以通过添加两个值来执行此存储过程,例如
exec my_sp 'value 1','value 2'
这就是事情变得棘手的地方
例如,我有一张桌子
1 | 2
aa bb
cc dd
等等
现在我想传递我的表值并创建一个结果表,例如
exec my_sp 'aa','bb'
exec my_sp 'cc','dd'
等等
如何实现这一点?我建议您修改您的过程,接受表类型作为输入参数,而不是变量 然后可以在一次快照中将表中的所有值传递给过程,并完成过程中所有行的操作 创建表类型
Create type my_sp_param as table (col1 varchar(2),col2 varchar(2))
改变程序
Alter procedure my_sp (@param my_sp_param)
as
..
使用表类型输入调用过程
declare @param my_sp_param
insert into @param (col1,col2)
select [1],[2] from yourtable
exec my_sp @param
如果无法更改过程,则必须使用游标或WHILE循环将每一行作为输入传递给过程,这是强烈不推荐的 不幸的是,最简单的方法是通过光标。为了理智起见,我将问题中的列从1和2重命名为A和B
Declare @c_a varchar (10),
@c_b varchar (10)
Declare cur Cursor For
(
Select A, B
From YourTable
)
Open cur
While (1 = 1)
Begin
Fetch Next From cur Into @c_a, @c_b
If (@@Fetch_Status <> 0) Break
Execute my_sp @c_a, @c_b
End
Close cur
Deallocate cur
令人遗憾的是,答案似乎是使用我的sp正在做什么的一个粗略或可能的副本?它只是返回结果,还是将记录插入表中?您应该搜索如何将表传递给存储的进程,参见moto gp answer了解一些提示这可能不是执行此查询的最有效方式,但是我的查询是一次性的,因此我使用了游标查询,但在开始时声明了一个临时表,然后在插入临时表的while子句中声明了一个临时表。为您对本Siyual的帮助干杯,并为名称不准确的示例列名道歉!