SQL Server:比较同一表

时间:2015-06-30 15:08:09

标签: sql sql-server sql-server-2008 sql-server-2012

我有一个SQL Server表,其中包含以下列:

  • Clientnum
  • 位置
  • 优势
  • SomeOtherFields

我需要能够比较特定客户端的所有行,并查看哪些列已更改/修改。

我通常的方法是连接客户端每一行的所有列,并比较连接的字符串。

但不知怎的,我知道可能有更好的方法(除了我的方法并没有真正告诉我哪些列是更改以及值之前/之后)。

任何建议都会有所帮助。请注意,我无法进行任何DBA级别的更改,例如跟踪更改等。非常感谢。

2 个答案:

答案 0 :(得分:0)

完成此任务的选项是创建历史记录表,并创建插入,更新和删除触发器。然后,您可以查询历史记录表以查找所需的所有详细信息。

示例代码:



CREATE TRIGGER [dbo].[uTests] 
   ON  [dbo].[Tests] 
   AFTER DELETE,UPDATE
AS 
BEGIN
	
	SET NOCOUNT ON;

    -- Log updated/delete record
	INSERT INTO [dbo].[Tests_TransHistory]
		(ID
	
		,[Test_Name]
	
		,[TestDate]
	
		,[UpdateDate]
		,[UpdateUser]
	
	SELECT 
		ID
	
		,[Test_Name]
	
		,[TestDate]
	
		,[UpdateDate]
		,[UpdateUser]
		
	FROM DELETED;
	
	--Update the time stamps.
	IF NOT EXISTS(SELECT * FROM INSERTED)
	BEGIN
		UPDATE dbo.Tests_TransHistory
		SET UpdateDate = getdate(), UpdateUser = current_user
		WHERE TransID = SCOPE_IDENTITY();
	END
	ELSE
	BEGIN
		UPDATE a
		SET a.UpdateDate = getdate(), a.UpdateUser = current_user
		FROM dbo.Tests a, INSERTED b
		WHERE a.ID = b.ID
	END

END
​




答案 1 :(得分:0)

如果您无法启用查询通知并使用SqlDependancy Class ...

您可以在表格中添加ROWVERSION类型的列。每次更新行时,SQL Server都会使用新的唯一ROWVERSION值更新varbinary(8)类型的列。使用此方法,您可以检查ROWVERSION列是否发生了更改并跳过这些行。如果它们不匹配,那么您可以单独检查这些行中的字段。

另一种选择是使用HASHBYTES函数来检测变化。如果您的客户端下拉视图...您可以在选择中添加散列值。类似的东西:

select *,
  HASHBYTES ('MD5', Clientnum) ClientnumHash,
  HASHBYTES ('MD5', Location) LocationHash,
  HASHBYTES ('MD5', Benifits) BenifitsHash,
  HASHBYTES ('MD5', SomeOtherFields) SomeOtherFieldsHash
 from Table

然后你可以比较散列函数的结果,比较varbinary(16)(MD5方法的最大长度)而不是列的整个字符串。