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

问题描述 投票:0回答:2

我创建了一个存储过程的表。我有近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;
sql-server
2个回答
1
投票

如果我理解你想要做什么,你想要使用INSERT..EXEC syntax。有许多限制,但它可能适合您:

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;

0
投票

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

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

EXEC @spvariable
  @newID = @newID output

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

© www.soinside.com 2019 - 2024. All rights reserved.