是否可以执行Insert Into存储过程?

时间:2014-02-19 17:10:52

标签: sql sql-server tsql sql-server-2012

基本上我有一个数据表,我想取每行的值并将其提供给存储过程。

在我完美的世界里,我会这样做

insert into StoredProcA @var1 @var2
select testdesc, testoption
from tableA
where testoption = 1

嗯,我认为这不会起作用。那么,如果可能的话,我如何从表/查询中获取所有数据并将其传递给存储过程?

编辑:存储过程已存在,并对传入数据进行了大量处理。来自源表本身的数据量仅为300行。

2 个答案:

答案 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

如果有人有任何改进,更好的方式或不同的方式,请发布解决方案作为答案。