Sql server 合并表的存储过程

Sql server 合并表的存储过程,sql-server,sql-server-2014,Sql Server,Sql Server 2014,我正在一个客户的销售数据集市上做一些工作,为他们的ERP添加一个新的连接。客户保留旧数据库(“888”)仅用于制造,并创建了新的“999”销售数据库。截至12月31日,所有历史记录均为888,从2016年1月1日起,新销售额为999 现在,我已经设置了所有SQL Server表和视图,以便使用新的表和视图作为之前仅用于888的复制品来查询888和999的ERP。现在我想要888和999数据集的并集,所以我们有一个单一的数据集 我对为fact表创建联合非常满意,因为不应该有重复的记录,但是我希望对

我正在一个客户的销售数据集市上做一些工作,为他们的ERP添加一个新的连接。客户保留旧数据库(“888”)仅用于制造,并创建了新的“999”销售数据库。截至12月31日,所有历史记录均为888,从2016年1月1日起,新销售额为999

现在,我已经设置了所有SQL Server表和视图,以便使用新的表和视图作为之前仅用于888的复制品来查询888和999的ERP。现在我想要888和999数据集的并集,所以我们有一个单一的数据集

我对为
fact
表创建联合非常满意,因为不应该有重复的记录,但是我希望对dim表有一些指导

客户和产品在ERP中从888复制到999,所以我绝对会有副本,但我只想从999复制一个版本。但是,假设某个客户从999删除,我仍然有888的历史记录,所以需要将其包括在内

我的想法是,我实际上无法进行联合(因为存在重复项),而是需要创建某种过程,插入999表中的所有记录,然后根据该过程处理888,在目标中不存在的位置添加记录

我的问题是,我真的不知道如何编写这样一个存储过程。如果我将
客户
维度作为一个示例,主键是
[订单债务人]
,描述性列的示例是
[订单债务人描述]


我要寻找的是编写代码的指导,该代码将从
999.customer
插入
merged.customer
,然后从
888.customer
检查并插入
merged.customer
,如果它不存在于
merged.customer
给定的表中
z888Customer
z999Customer
已填充

据我所知,以下是您描述的重复数据消除案例:

Case    z888Customer        z999Customer         Use Data From
A       123                 (doesn't exist)      888
B       (doesn't exist)     789                  999
C       456                 456                  888
因此,一种方法是创建一个包含以下内容的视图:

-- Case A - only 888 records that are not in 999
SELECT Debtor_ID, Field1, Field2
FROM z888Customer
WHERE NOT EXISTS (
    SELECT *
    FROM z999Customer
    WHERE z999Customer.Debtor_ID =  z888Customer.Debtor_ID
    )
UNION ALL
-- Case B and C
SELECT Debtor_ID, Field1, Field2
FROM z999Customer
假设视图名为LoadCustomers,则您只能使用以下内容加载新的客户:

INSERT INTO CustomerDimension (Field1,Field2,DebtorID)
SELECT Field1,Field2,DebtorID FROM LoadCustomers
WHERE NOT EXISTS (
    SELECT * 
    FROM DimCustomer 
    WHERE DimCustomer.DebtorID = LoadCustomer.DebtorID
 )
因此,这将继续增加内容。即使它从源中删除,也不会从维度中删除,因为没有运行delete语句

我们在这里使用您的ID作为匹配密钥。因此,您需要注意以下事项:

  • 如果从数据库中删除DebtorID 63,然后在该数据库中重新创建为新的完全debtor,并重用相同的ID,则不会反映该ID-旧ID将保持不变
  • 如果你有两个不同的数据库,我保证它们会有分歧。我建议您将“历史”数据库更改为只读(
    alterdatabase SET read_only
    ,同时将文件系统中的文件设置为只读),否则人们会摆弄您,您会遇到问题
  • 我只在上面提供了一个
    INSERT
    案例。没有更新。这意味着,如果债务人更改源中的名称,它将不会反映在您的数据仓库中,因为只有插入步骤而不是更新步骤
这些与您的“复制”相关,即您正在将数据合并到中,并且您需要为每种情况确定规则

哦,还有一件事考虑使用模式来分离你的表(不是Z前缀)


因此,您的维度可能是dbo.DimCustomer,而您的staging可能是staging.888Customer。不过,登台通常是一个完全不同的数据库。

您好,欢迎使用。请添加代码的重要部分,以证明您自己尝试过某些东西。请阅读并提出一个更受欢迎的问题。嗨#davejal,我不知道如何做,所以我没有尝试将代码整合在一起。我知道我需要什么,但不知道怎么做!这有意义吗?是的,有意义,但我们不是免费工作,也不会从我们的头脑中为您提供完整的解决方案
,尝试一些东西,然后返回您尝试过的内容和遇到的问题,然后肯定会帮到您。什么版本的SQL Server?如果是2008年或更高版本,有很多方法可以剥下这只猫的皮,包括MERGE语句:客户端有SQL Server 2014。谢谢斯图尔特。太棒了@nick.mcdermaid!非常感谢你。下周我将在我的客户那里试用,并让你知道它是如何进行的。祝你周末愉快。约翰你周末也过得很愉快。请记住,这又回到了您的“合并策略”——对于两个系统之间的每一个数据不一致的情况,您都要做些什么。