将存储过程的输出值插入表中

时间:2018-03-01 17:07:33

标签: sql-server

我创建了一个存储过程的表。我有近50个不同的值要输入存储过程,所以我创建了一个表来执行它们从db本身捕获值。以下是我正在使用的流程。

DECLARE @spvariable varchar(max);
SELECT @spvariable = e.ExecutionQuery FROM dbo.tmpsptable e where e.ID = @cnt;
Exec @spvariable;

在存储过程中,我有一个在执行每个存储过程后返回的值,表示在SP的末尾有一个带有SCOPE_IDENTITY()的select语句。当然,每个值都是唯一的。现在问题是,对于每次执行,我想将返回的值存储在我的表tmpsptable中。但是如何调用它并保存在特定行?

阻止Openrowset在我的服务器上使用它。我不能将insert语句添加到同一个SP中,因为它也用于其他目的。

以下是我正在尝试的那个。我知道在这种情况下使用OUTPUT参数是错误的。但是什么可以成为解决方案?

DECLARE @spvariable VARCHAR(MAX);
DECLARE @id INT;
DECLARE @insertedId TABLE(id INT);
DECLARE @cnt INT= 1;
WHILE @cnt <= 10
    BEGIN
       SELECT @spvariable = e.ExecutionQuery FROM dbo.tmpsptable e where e.ID = @cnt;
       EXEC @spvariable;  
        OUTPUT INSERTED.SerialNumber
        INTO @insertedId;

       UPDATE e
          SET
              SerialNumber = @insertedId
        FROM dbo.tmpsptable e
        WHERE e.ID = @cnt;
        SET @cnt = @cnt + 1;
    END;

2 个答案:

答案 0 :(得分:1)

如果我了解您要执行的操作,则需要使用INSERT..EXEC 语法。有许多限制,但它应该适合你:

DECLARE @spvariable VARCHAR(MAX);
DECLARE @id INT;
--DECLARE @insertedId TABLE(id INT);
-- you cannot INSERT from an EXEC into a @table variable
CREATE TABLE #insertedId(id INT);

DECLARE @cnt INT= 1;
WHILE @cnt <= 10
    BEGIN
       SELECT @spvariable = e.ExecutionQuery FROM dbo.tmpsptable e where e.ID = @cnt;

       DELETE FROM #instertedId;
       -- NOTE: the EXEC Result Set must exactly match the column types
       INSERT INTO #insertedId
       EXEC @spvariable;

       UPDATE e
          SET
              SerialNumber = (Select TOP 1 id From #insertedId)
        FROM dbo.tmpsptable e
        WHERE e.ID = @cnt;
        SET @cnt = @cnt + 1;
    END;

答案 1 :(得分:0)

I know using OUTPUT parameter is wrong - 为什么?

如果您正在使用SCOPE_IDENTITY(),那么这始终是每个SP调用创建的单行,那么您肯定可以将此标量值作为输出参数返回:

EXEC @spvariable
  @newID = @newID output

但总的来说我不喜欢你的做法。 WHILE,单行SP ......