毎日新しいデータをロードするテーブルと、そのテーブルへの変更の履歴を含む別のテーブルがあります。データが最後にロードされてからデータが変更されているかどうかを確認する最良の方法は何ですか?
たとえば、さまざまな国の戦略を含むテーブル@aがあり、テーブル@bはテーブル@aに加えられた変更を追跡します。checksum()を使用して、変更可能なフィールドをハッシュし、既存のハッシュが新しいハッシュと異なる場合はそれらをテーブルに追加できます。ただし、MSDNは、「衝突」が発生する可能性があるため、これは良い考えではないと考えています。たとえば、2つの異なる値が同じチェックサムにマップされます。
チェックサムのMSDNリンク http://msdn.microsoft.com/en-us/library/aa258245(v=SQL.80).aspx
サンプルコード:
declare @a table
(
ownerid bigint
,Strategy varchar(50)
,country char(3)
)
insert into @a
select 1,'Long','USA'
insert into @a
select 2,'Short','CAN'
insert into @a
select 3,'Neutral','AUS'
declare @b table
(
Lastupdated datetime
,ownerid bigint
,Strategy varchar(50)
,country char(3)
)
insert into @b
(
Lastupdated
,ownerid
,strategy
,country
)
select
getdate()
,a.ownerid
,a.strategy
,a.country
from @a a left join @b b
on a.ownerid=b.ownerid
where
b.ownerid is null
select * from @b
--get a different timestamp
waitfor delay '00:00:00.1'
--change source data
update @a
set strategy='Short'
where ownerid=1
--add newly changed data into
insert into @b
select
getdate()
,a.ownerid
,a.strategy
,a.country
from
(select *,checksum(strategy,country) as hashval from @a) a
left join
(select *,checksum(strategy,country) as hashval from @b) b
on a.ownerid=b.ownerid
where
a.hashval<>b.hashval
select * from @b