基本上我有一个数据表,我想取每行的值并将其提供给存储过程。
在我完美的世界里,我会这样做
insert into StoredProcA @var1 @var2
select testdesc, testoption
from tableA
where testoption = 1
嗯,我认为这不会起作用。那么,如果可能的话,我如何从表/查询中获取所有数据并将其传递给存储过程?
编辑:存储过程已存在,并对传入数据进行了大量处理。来自源表本身的数据量仅为300行。
答案 0 :(得分:1)
为了实现这一目标,您需要做一些事情,因为您的参数获得了创建表类型所需的多个值,并使您的商店过程接受该类型的参数。
由于您要传递TABLE
作为参数,因此您需要创建一个TABLE TYPE,如下所示
表类型
CREATE TYPE dbo.Prco_Table AS TABLE
(
[Val1] Data Type
[Val2] Data Type
)
GO
接受该类型参数的存储过程
CREATE PROCEDURE mainValues
@TableParam Prco_Table READONLY --<-- Accepts a parameter of that type
AS -- Note it is ReadOnly
BEGIN
SET NOCOUNT ON;
/* do your insert from this parameter or other cool stuff */
INSERT INTO Target_Table (Col1, Col2)
SELECT [Val1] , [Val2]
FROM @TableParam --<-- Table Type variable
END
EXECUTE PROC
声明该类型的变量并使用您的值填充它。
DECLARE @Table ClaimData( --<-- Declare a variable of your type
[Val1] Data Type
[Val2] Data Type
);
-- Populate the variable
INSERT INTO @Table ([Val1],[Val2])
SELECT testdesc, testoption
FROM tableA
WHERE testoption = 1
EXECUTE mainValues @Table --<-- Pass this variable of Table Type
答案 1 :(得分:0)
我最终使用@logixologist建议并使用了光标。
效果很好。
declare testCursor cursor
for
select testdesc, testoption
from tableA
where testoption = 1
open testCursor
declare @p1 varchar(max), @p2 varchar(8)
fetch next from testCursor into @p1, @p2
while (@@fetch_status <> -1)
begin
if (@fetch_status <> -2)
exec db1.dbo.usr_storedproc @p1, @p2
fetch next from testCursor into @p1, @p2
end
close testCursor
deallocate testCursor
go
如果有人有任何改进,更好的方式或不同的方式,请发布解决方案作为答案。