对于每个UPDATE,INSERT Elsewhere存储过程

时间:2012-03-22 12:30:41

标签: sql sql-server tsql stored-procedures foreach

可能是这种情况只能通过循环来实现,但谁知道呢。

我正处于使用MS SQL Server的Java编码环境中,我一直在搜索并且似乎无法找到一个很好的方法来插入记录,例如我们必须为每个完成的操作保持更新的事务历史记录表在其他表中发出单个UPDATE命令来更新许多记录。对于更新的每个UPDATE记录,我想做一个插入语句本质上这是我们目前在不使用存储过程的代码中一个接一个地做的事情:

UPDATE table SET column1=null, column2=null, column3=0, column4=getDate() where column5=? and column6=1
...
//Insert transtable
createTransaction(tran, localConn);
...
INSERT INTO transtable ( a, b, c, d, e, f, g, h, i, " +
                 "j, k, l, m, n, o, p, q, r, s, " +
                 "t, u, v, w) " +
                 " VALUES ( ? ,? ,? ,? ,? ,? ,getDate() ,getDate() ,getDate() ,? ,? ,? ,? ,? ,? ,? ,getDate() ,getDate(),? ,? ,? ,?,? )

我想做什么,而不是UPDATE:

USE [DB]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[setFlags]
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

UPDATE table1
SET column1 = '2', column2 = NULL
WHERE column1 = '1' or column1 = '2'
--FOR EACH UPDATED ROW IN THIS TABLE, CREATE A TRANSACTION IN TRANSTABLE

UPDATE table2
SET column1 = '0', column2 = NULL
WHERE column1 = '1'
--FOR EACH UPDATED ROW IN THIS TABLE, CREATE A TRANSACTION IN TRANSTABLE

UPDATE table3
SET column1 = '0', column2 = NULL
WHERE column1 = '1'
--FOR EACH UPDATED ROW IN THIS TABLE, CREATE A TRANSACTION IN TRANSTABLE

END

但是,对于每个更新的记录(通常约有100条记录将使用此实用程序更新),在我们的transtable表中也需要完成大约100个INSERT,其中还包含正在更新的行中的一些数据

有没有人有任何想法?有资源吗?等等。?我有点像初学者,所以有时我只是不知道要搜索什么。最近我一直在搜索“每个UPDATE INSERT SQL”或“每个更新的循环插入”

可能需要做TSILE,但是如果有更好的方式(它听起来也非常低效),那就太好了解: http://msdn.microsoft.com/en-us/library/ms178642.aspx

2 个答案:

答案 0 :(得分:2)

您不知道您使用的是哪个版本的SQL Server,也不知道哪个版本。如果您使用的是2008企业版,请查看Change Data Capture。有一篇很好的介绍文章here

答案 1 :(得分:1)

对于您的情况,最好的解决方案可能是使用触发器,因为MSDN定义:“触发器是一种特殊的存储过程,在数据库服务器中发生事件时自动执行。< / EM>”。

以下脚本在tempdb上创建两个表:mydatanowmydatalog。每次插入或更新行makelog时触发器mydatanow都会运行,并且其实现会将插入mydatanow的所有行复制到mydatalog - 如果有多行受到影响通过更新语句,将复制所有行。

USE tempdb;
GO
CREATE TABLE mydatanow (id SMALLINT, c1 VARCHAR(10), c2 VARCHAR(10));
CREATE TABLE mydatalog (id SMALLINT, c1 VARCHAR(10), c2 VARCHAR(10), moment DATETIME);
GO
CREATE TRIGGER makelog ON mydatanow
AFTER INSERT, UPDATE
AS BEGIN
    INSERT mydatalog(id, c1, c2, moment)
    SELECT id, c1, c2, GETDATE()
    FROM inserted
END
GO
INSERT mydatanow VALUES (1, 'abe', 'apple');
INSERT mydatanow VALUES (2, 'beth', 'banana');
UPDATE mydatanow SET c1 = 'carl', c2 = 'no fruit';
GO
SELECT * FROM mydatanow;
-- id     c1         c2
-- ------ ---------- ----------
-- 1      carl       no fruit
-- 2      carl       no fruit

SELECT * FROM mydatalog;
-- id     c1         c2         moment
-- ------ ---------- ---------- -----------------------
-- 1      abe        apple      2012-05-10 19:36:45.843
-- 2      beth       banana     2012-05-10 19:36:45.843
-- 1      carl       no fruit   2012-05-10 19:36:45.847
-- 2      carl       no fruit   2012-05-10 19:36:45.847