2010-04-29 63 views
1

例如,我有一個名爲EmployeeName的列。

如何跟蹤列中發生的更改數量? T-SQL - SQL Server

每次用戶更改/修復他的名字,我需要保持一個計數。如果他兩次更改他的名字,則count爲2.另外,我需要存儲員工在EmployeeName上所做的每個更改的時間,例如,如果名字本質上是詹姆斯,創建時間是上午9:00,然後員工在上午11:00更改爲約翰,那麼我需要保留這個新時間和新的價值,以及上一個在詹姆斯上午9:00的價值。

我希望它清楚!謝謝你們......最佳答案將被選中......

如果這需要觸發器,給出一個粗略的僞代碼將非常感激。

回答

2

首先 - 如果尚未實施,強烈建議由永久性標識符(即NOT EmployeeName)標識員工,以便您可以跟蹤所有內容。

如果您想使用觸發器,可以使用AFTER UPDATE觸發器並使用if update(EmployeeName)查找對名稱的更改。

如果已更新,您可以同時增加Employee表上的count列。使用inserted表來標識已更新的條目。 (計數是否必不可少?如果您正在存儲名稱更改的歷史記錄,我不認爲有必要有一個計數列 - 這是多餘的信息。)

然後,您將在您的員工姓名歷史記錄中添加一行表格用當前的時間戳來保存這個改變的細節。

1

觸發器就足夠了。觸發器應該儘可能簡單和輕量級,所以只需將一個條目插入某個日誌記錄表中,並稍後計算它的聚集。

0

在SQL Server 2008中,你有新的變化數據捕捉功能,你可以用它來獲取更改的數量,再加上所做的更改:http://weblogs.sqlteam.com/derekc/archive/2008/01/28/60469.aspx

示例Northwind代碼,鏈接可以隨着時間的推移死:

EXEC Sp_cdc_enable_table 
    humanresources , 
    employee , 
    'HumanResources_Employee' , 
    1 , 
    dbo 


UPDATE humanresources.employee 
SET ContactId = 1 
WHERE employeeid = 1 

DECLARE @begin_lsn BINARY(10), @end_lsn BINARY(10) 

SELECT @begin_lsn = sys.fn_cdc_get_min_lsn('humanresources_employee') 
SELECT @end_lsn = sys.fn_cdc_get_max_lsn() 

SELECT * FROM cdc.fn_cdc_get_all_changes_humanresources_employee(@begin_lsn, @end_lsn, 'all'); 
相關問題