使用存储过程更新带有结果集的新列

时间:2014-06-18 12:06:58

标签: sql sql-server

我有一张包含现有数据的表格。我需要在表中添加一个新列,该列将使用存储过程检索的值进行填充。这适用于我将添加到表中的新数据。

如何为每个现有行运行存储过程,从两个现有列传入参数,然后使用结果更新新列。实际上,我希望运行以下内容:

UPDATE 
  TableWithNewColumn
SET
  NewColumn = EXEC NewProcedure(TableWithNewColumn.ID, TableWithNewColumn.Code);

请参阅此处的小提琴:http://www.sqlfiddle.com/#!3/b0625/1

我知道标量函数对于此任务是理想的,但遗憾的是SP已由第三方提供,这是我提供数据的唯一方法。

2 个答案:

答案 0 :(得分:2)

下面是一个游标示例,假设id列是唯一的。如果您可以更改存储过程以返回输出参数,则可以直接在update语句中使用output参数,而不是将proc结果集插入表变量和更新中的子查询。

DECLARE
    @id int,
    @code varchar(16);

DECLARE @Result TABLE (
    ResultValue varchar(16)
    );

DECLARE TableRows CURSOR LOCAL FOR
    SELECT
        id
        ,code
    FROM dbo.TableWithNewColumn;
OPEN TableRows;
WHILE 1 = 1
BEGIN

    FETCH NEXT FROM TableRows INTO @id, @code;
    IF @@FETCH_STATUS = -1 BREAK;

    DELETE FROM @Result;
    INSERT INTO @Result EXEC dbo.NewProcedure @id, @code;

    UPDATE TableWithNewColumn
    SET NewColumn = (SELECT ResultValue FROM @Result)
    WHERE id = @id;

END;
CLOSE TableRows;
DEALLOCATE TableRows;

答案 1 :(得分:0)

这是一个想法...使用ID,Code和NewColumn结果的值填充TEMP表。然后使用对临时表的连接更新表TableWithNewColumn。我建议这样做,因为用所有这些过程调用进行更新会很慢。