有效地在两个SQL Server表之间应用差异

时间:2012-08-09 13:53:52

标签: tsql sql-server-2008-r2

我有一天一次的摄取案例,我将通过FTP获取一个包含4个数据库表的最新版本的大文件。

对于每张表,我想:

  1. 在临时数据库中截断表
  2. 将FTP'd文件BCP到该表中
  3. 在登台表和生产表之间找到差异(IUD)
  4. 将任何所需的IUD放到生产表中,使其与登台表
  5. 相匹配

    我确信这是一个相当普遍的问题,但我不能百分之百地确定接近它的最佳方法。

    是否存在针对此类问题的内置T-SQL功能,或者我是否只需要进行各种连接以查找插入/更新/删除的记录并手动执行它们?我确信我可以通过第二种方式来做到这一点,但任何建议都非常受欢迎(不是寻找工作代码)。

2 个答案:

答案 0 :(得分:1)

由于没有人把它作为一个真正的答案,Mikael Eriksson在评论中提到的MERGE命令是正确的方法,它运作良好。

以下是一个简单的示例用法:

MERGE dbo.DimProduct AS Target
USING (SELECT ProductID, ProductName, ProductColor, ProductCategory FROM dbo.StagingProduct) AS Source
ON (Target.ProductID = Source.ProductID)
WHEN MATCHED THEN
    UPDATE SET Target.ProductName = Source.ProductName
WHEN NOT MATCHED BY TARGET THEN
    INSERT (ProductID, ProductName, ProductColor, ProductCategory)
    VALUES (Source.ProductID, Source.ProductName, Source.ProductColor, Source.ProductCategory)
OUTPUT $action, Inserted.*, Deleted.*;

来自:http://www.bidn.com/blogs/bretupdegraff/bidn-blog/239/using-the-new-tsql-merge-statement-with-sql-server-2008

帮助了我。

答案 1 :(得分:0)

RedGate的SQL Compare产品具有自动化功能。

http://downloads.red-gate.com/HelpPDF/ContinuousIntegrationForDatabasesUsingRedGateSQLTools.pdf

(我与redgate无关。我甚至不喜欢他们的产品,但在这种情况下似乎符合这种情况)