可能是这种情况只能通过循环来实现,但谁知道呢。
我正处于使用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
答案 0 :(得分:2)
您不知道您使用的是哪个版本的SQL Server,也不知道哪个版本。如果您使用的是2008企业版,请查看Change Data Capture。有一篇很好的介绍文章here。
答案 1 :(得分:1)
对于您的情况,最好的解决方案可能是使用触发器,因为MSDN定义:“触发器是一种特殊的存储过程,在数据库服务器中发生事件时自动执行。< / EM>”。
以下脚本在tempdb上创建两个表:mydatanow
和mydatalog
。每次插入或更新行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