Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL—通过存储过程传递表变量_Sql_Sql Server_Tsql_Stored Procedures - Fatal编程技术网

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的帮助干杯,并为名称不准确的示例列名道歉!