Sr. ID FName LName Mark
1 P1 amar ranjan 100
2 P2 sameer kumar 200
3 P1 amar ranjan 200
此处我更新了Mark
列的第一行。
在单行的每次更新中,我创建了具有更新值的新行(请参阅第3行)。 是否可以获取表中已更新的列名?
答案 0 :(得分:1)
由于您使用的是SQL Server 2008,因此可以使用OUTPUT
子句获取更新的数据。类似的东西:
UPDATE TableName
SET Sr = 'foo',
ID = someid,
FName = 'bar',
LName = 'other foo',
Mark = someid
OUTPUT
inserted.FName,
deleted.FName AS oldFName,
inserted.FName AS newFName
WHERE SR = 1; -- for mark;
但是,如果您需要在另一个表History
中插入数据,那么您可以创建AFTER UPDATE
TRIGGER
来更新历史数据表,例如:
USE DatabaseName;
GO
IF OBJECT_ID ('Sch.TableNameTrigger', 'TR') IS NOT NULL
DROP TRIGGER Sch.TableNameTrigger;
GO
CREATE TRIGGER Sch.TableNameTrigger
ON FirstTable
AFTER UPDATE
AS
INSERT INTO HistoryTable
SELECT * FROM DELETED
GO
答案 1 :(得分:1)
我使用Mahmoud Gamal的答案和SQL Fiddle演示作为起点。
您需要的是什么,但如果您有权访问更新过程,我建议您在任何存储过程中管理更新,并将更改直接保存在表格中。
如果你需要一个触发器,这样的东西可以工作,但正如你所看到的,它有它自己的缺点:两个临时表,因为范围和光标。
它基本上每次都会为每列生成一个检查,并将列的新旧值插入到历史记录表中。
(也建议将ID列更改为主键和标识)
我还制作了SQL FIDDLE演示
CREATE TABLE TableName (Sr INT, ID VARCHAR(10), FName VARCHAR(50),
LName VARCHAR(50), Mark VARCHAR(50));
CREATE TABLE HistoryTable (ID VARCHAR(10), ColumnName VARCHAR(50),
PrevValue VARCHAR(50), NewValue VARCHAR(50));
INSERT INTO TableName VALUES
(1, 'P1', 'amar', 'ranjan' , 100),
(2, 'P2', 'sameer', 'kumar', 200),
(3, 'P1', 'amar', 'ranjan', 200);
CREATE TRIGGER TableNameTrigger
ON TableName
AFTER UPDATE
AS
SELECT * INTO #Deleted FROM Deleted
SELECT * INTO #Inserted FROM Inserted
DECLARE @ColName varchar(64)
DECLARE columnCursor CURSOR FOR
SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'TableName' AND TABLE_SCHEMA='dbo'
OPEN columnCursor
FETCH NEXT FROM columnCursor INTO @ColName
WHILE (@@FETCH_STATUS <> -1)
BEGIN
EXEC(N'INSERT INTO HistoryTable
SELECT Deleted.Sr, ''' + @ColName + ''', Deleted.'+ @ColName + ',' + 'Inserted.' + @ColName +'
FROM #Deleted Deleted
INNER JOIN #Inserted Inserted ON Inserted.Sr = Deleted.Sr
WHERE Deleted.'+ @ColName + ' != Inserted.' + @ColName)
FETCH NEXT FROM columnCursor INTO @ColName
END
DROP TABLE #Deleted
DROP TABLE #Inserted
CLOSE columnCursor
DEALLOCATE columnCursor
GO
答案 2 :(得分:0)
我想说,创建另一个名为history的表并存储更新的内容&amp;当
在一个表中制作重复条目是BAD设计。另外我不确定你是如何处理重复的条目的?
假设您要打印P1
如何处理该数据的数据?
在我的一个网站中,客户想知道谁添加/编辑/删除了什么以及何时删除。所以我创建了一个名为HISTORY的新表,一旦添加/编辑/删除完成,我就在该表中输入。为一个用户创建许多行是BAD设计。