T SQL - 通过存储过程传递表变量

时间:2016-02-24 16:38:19

标签: 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'

依旧..........

我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:5)

我建议您更改您的程序以接受table type作为输入参数而不是variables

然后,您可以一次性将表中的所有值传递给过程,并为过程中的所有行完成操作。

创建表格类型

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

如果您无法更改过程,则必须使用CURSOR或WHILE循环将每行作为输入传递给您的过程,这是非常不推荐的。

答案 1 :(得分:2)

最简单的方法(不幸的是)通过CURSOR。为了理智,我将问题中的列从12重命名为AB

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