微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从存储过程结果集中插入/更新表上的数据

如何解决从存储过程结果集中插入/更新表上的数据

看一下@srutzky的解决方案,它更适合此问题

您可以做的第一件事是将所有内容写入表中。为此,您需要定义一个表,该表具有与存储过程返回的列相同的列:

DECLARE @myTempTableName TABLE(
                                daTarow1 DATATYPE,
                                daTarow2 DATATYPE,
                                ...
                               )

INSERT INTO @myTempTableName(daTarow1, daTarow2,...)
EXEC( *mystoredprocedure* )

现在,您需要的所有数据都在表中。下一步是检查您需要更新什么以及要插入什么。假设daTarow1是用于检查其是否已经存在的变量(例如:相同的名称或相同的ID) 并且说它是唯一的(否则,您还需要某些女巫是唯一的-遍历临时表时需要)

DECLARE @rows INT,
        @daTarow1 DATATYPE,
        @daTarow2 DATATYPE, ...

-- COUNT Nr. of rows (how many rows are in the table)
SELECT 
    @rows = COUNT(1) 
FROM 
    @myTempTableName

-- Loop while there are still some rows in the temporary table
WHILE (@rows > 0)

BEGIN

  -- select the first row and use daTarow1 as indicator which row it is. If daTarow1 is not unique the index should be provided by the stored procedure as an additional column
  SELECT TOP 1
    @daTarow1 = daTarow1,
    @daTarow2 = daTarow2, ..
  FROM
    @myTempTableName

  -- check if the value you'd like to insert already exists, if yes --> update, else --> insert
  IF EXISTS (SELECT * FROM *TableNametoInsertOrUpdateValues* WHERE daTarow1=@daTarow1)
      UPDATE 
            *TableNametoInsertOrUpdateValues*
      SET
            daTarow2=@daTarow2
      WHERE
            daTarow1=@daTarow1

  ELSE
      INSERT INTO 
            *TableNametoInsertOrUpdateValues* (daTarow1, daTarow2)
      VALUES 
            (@daTarow1, @daTarow2)


  --IMPORTANT: delete the line you just worked on from the temporary table
  DELETE FROM 
     @myTempTableName 
  WHERE 
     daTarow1= @daTarow1

  SELECT 
     @rows = COUNT(1) 
  FROM 
     @myTempTableName

END -- end of while-loop

声明可以在此查询开始时完成。我将其放在使用它的地方,以便于阅读。

解决方法

我有一个称为proc_item的存储过程,该过程从不同的表中获取数据(使用连接)。我希望存储过程的结果集可以在另一个称为Item的表上插入(如果数据是新的)或更新(如果数据已经存在)。有人可以给我一些有关如何执行此操作的想法吗?我是sql,存储过程和循环的新手。

谢谢

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。