问题描述
我有一个不断更新的数据库表。我只想查询在列中具有特定属性的行上所做的更改/添加。例如获取已更改/添加的行,其“描述”列为“ xyz”。我的最终目标是将这些行复制到另一个数据库中的另一个表中。这有可能吗?不只是查询和覆盖另一个数据库中的行的原因是为了避免效率低下。
到目前为止我尝试过什么?
-
我能够在表上选择查询来获取行,但它为我提供了所有行,而不是已更改或最近添加的行。如果我将这些行添加到另一个数据库的表中,那么我唯一的选择就是覆盖这些行。
-
日志表将更改记录到表中,但是我无法在sql中放置其他过滤器,sql告诉我这些更改中的哪些与“ description”列关联为“ xyz”。
解决方法
编写update
语句以利用OUTPUT
捕获前后值并将它们记录到您选择的表中。
这是一个非常简单的示例update
,该示例使用output
存储 ActivityType 列的值前后的RowID:
DECLARE @MyTableVar table (
SummaryBefore nvarchar(max),SummaryAfter nvarchar(max),RowID int
);
update DBA.dbo.dtest set ActivityType = 3
OUTPUT deleted.ActivityType,inserted.ActivityType,inserted.RowID
INTO @MyTableVar
select * From @MyTableVar
,
您可以通过两种方式完成
-
具有新的日期字段/列,例如update_time和/或create_time(如果需要,可以默认设置)。这些字段将指示记录的状态。您需要保存您的previous_run_time,然后您的选择查询将查找update_time / create_time大于previous_run_time的记录,然后将这些记录移至新的数据库。
-
已打开CDC的源表,该表在SQL Server中默认可用,然后仅移动那些已受影响的记录。