获取列名称

时间:2012-11-12 13:23:13

标签: sql sql-server sql-server-2008 columnname

Sr. ID   FName    LName    Mark
1   P1   amar     ranjan   100
2   P2   sameer   kumar    200
3   P1   amar     ranjan   200

此处我更新了Mark列的第一行。

在单行的每次更新中,我创建了具有更新值的新行(请参阅第3行)。 是否可以获取表中已更新的列名?

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

SQL Fiddle Demo

答案 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如何处理该数据的数据?


编辑1

在我的一个网站中,客户想知道谁添加/编辑/删除了什么以及何时删除。所以我创建了一个名为HISTORY的新表,一旦添加/编辑/删除完成,我就在该表中输入。为一个用户创建许多行是BAD设计。