插入记录和每个运行更新语句的存储过程

时间:2013-01-26 17:49:35

标签: sql-server sql-server-2005 stored-procedures

我想有一个存储过程将行插入表中(从另一个表中的select查询中检索),并为每个新插入的行获取其标识并使用标识更新原始表

伪代码 -

records = select id,city,state,country from USER where name=@name

for each record in records  // for each rows selected
   insert into LOCATION(city,state,country) values(@record.city,@record.state,@record.country); //inserts a value into LOCATION table
   @id = SCOPE_IDENTITY(); // gets the identity of the newly inserted row
   update USER set LocationId=@id where Id=@record.id //updates the new id back to old table's column
end

这是一个数据迁移任务,我们希望将LOCATION与USER表分开

提前感谢您为此主题花费的时间和精力。

1 个答案:

答案 0 :(得分:5)

你可以这样做:

DECLARE @InsertedValues TABLE (ID INT, City VARCHAR(50), State VARCHAR(50), Country VARCHAR(50))

INSERT INTO dbo.Location(City, State, Country)
  OUTPUT Inserted.ID, Inserted.City, Inserted.State, Inserted.Country INTO @InsertedValues(ID, City, State, Country)
    SELECT City, State, Country
    FROM dbo.YourSourceTable

有了这个,您现在可以在@InsertedValues表变量中插入值 - 包括新定义的标识值 - 现在您可以根据需要更新源表。 / p>

UPDATE dbo.YourSourceTable
SET 
   Col1 = iv.Col1,
   Col2 = iv.Col2,  -- etc. - do whatever you nee to do here!
FROM @InsertedValues iv
WHERE  .........  -- here, you need some condition to link the inserted values to the original table

这根本不需要任何光标或任何其他凌乱的RBAR(逐行激动行)处理 - 一切都基于设置很好,并且尽可能快。

了解有关MSDN SQL Server Books OnlineOUTPUT子句的详情 - 您也可以在插入,更新甚至删除语句中使用OUTPUT子句!