Для каждого обновления вставьте хранимую процедуру в другом месте - PullRequest
2 голосов
/ 22 марта 2012

Может случиться так, что это возможно только с помощью цикла, но кто знает.

Я нахожусь в среде программирования Java, использующей MS SQL Server, и я искал вокруг и, похоже, не могуНайдите хороший способ вставки записей, скажем, в таблицу истории транзакций, которую мы должны обновлять при каждом действии, выполняемом в других таблицах, после выполнения одной команды 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(),? ,? ,? ,?,? )

Что я хотел бы сделатьdo, это что-то вроде этого вместо 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 записей будет обновлено с помощью этой утилиты), необходимо также выполнить около 100 INSERT.наша переносимая таблица, которая также будет содержать некоторые данные из обновляемых строк.

У кого-нибудь есть идеи?Ресурсы там?Так далее.?Я начинающий, так что иногда я просто не знаю, что искать.В последнее время я искал "для каждого UPDATE INSERT SQL" или "зацикливание вставки для каждого обновления"

I может нужно сделать WHILE TSQL, но если есть лучший способ (этотакже звучит ужасно неэффективно), было бы здорово узнать: http://msdn.microsoft.com/en-us/library/ms178642.aspx

Ответы [ 2 ]

2 голосов
/ 22 марта 2012

Вы не сообщаете, какую версию SQL Server вы используете, ни какую редакцию.Если вы работаете в редакции 2008 Enterprise, взгляните на Change Data Capture .Хорошая вводная статья здесь .

1 голос
/ 10 мая 2012

Вероятно, лучшим решением для вашей ситуации является использование триггера, поскольку MSDN определяет: " Триггер - это особый вид хранимой процедуры, которая автоматически выполняется при возникновении события на сервере базы данных. . ».

Следующий скрипт создает две таблицы в базе данных 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...