1

所以我真的不太了解编码或SQL。我习惯于访问,但不是专业人士或资深人士。我有来自服务器的数据,我使用查询来添加本地数据库信息。数据组合在一起后,我需要将其上传回 SQL Server。

访问表:table1

serial# cust# cust_name order# model#

SQL Server 表:dbo_Data1

serial# cust# cust_name order# model#

除了 SQL Server 之外,我什么都有order#,并且model#可以在 Access 中找到所有信息。我只需要将我的 Access 表上传到 SQL Server。我一直在阅读,这MERGE是最好的分批方式,但我不明白如何做到这一点。我是否使用 SQL 视图编写查询并使用此http://technet.microsoft.com/en-us/library/bb510625.aspx格式?那只是忽略访问更新/生成表/附加查询类型?

此外,我不能只删除旧数据,因为我想避免从 1998 年提取数据进行更新,并且需要将这些数据保留在服务器上。此外,进行此更新的旧方法是仅使用 Access 追加查询,如果每周完成,这可能需要 10 个小时(并且已经好一年没有完成了)。我想避免 10 小时的更新,因为我每天只工作 8 小时,并且没有额外的计算机让我在 Access 工作时保持忙碌。

任何人都可以为我阐明这一点吗?我的主要问题是如何MERGE工作?

谢谢。

4

1 回答 1

2

MERGE是 Transact-SQL 的一项功能,因此如果您想使用它,您必须在 Access 中运行 Pass-Through 查询。以下是你将如何做到这一点:

假设您在 SQL Server 上有一个“主”[ExchangeRates] 表,其中包含以下数据:

CurrencyName   CanadianDollarEquivalent
-------------  ------------------------
European Euro                    1.3729
U. S. Dollar                          1

您在 SQL Server 上还有一个名为 [ExchangeRateUpdates] 的表,该表具有相同的结构。您在 Access 中将该表定义为名为 [dbo_ExchangeRateUpdates] 的链接表。

在 Access 中还有一个名为 [LocalTable] 的本地工作表,同样具有相同的结构。让我们想象一下,经过一大堆“数字运算”之后,您确定要应用于服务器上的“主”表的更新是:

  • 您想更新“美元”汇率,因为这两种货币不再等价,并且

  • 您想为澳元添加汇率

因此,在进行本地所需的任何处理(以获得最大速度)之后,您的 [LocalTable] 将包含

CurrencyName       CanadianDollarEquivalent
-----------------  ------------------------
U. S. Dollar                          1.047
Australian Dollar                    0.9622

您可以通过在 Access 中运行三个查询将这些更改合并到 SQL Server 上的主表中:

查询 1:删除查询以清空 [ExchangeRateUpdates] 表中的任何先前更新

DELETE FROM dbo_ExchangeRateUpdates;

查询 2:将当前更新上传到 [ExchangeRateUpdates] 表的追加查询

INSERT INTO dbo_ExchangeRateUpdates
SELECT * FROM LocalTable;

查询 3:将 [ExchangeRateUpdates] 表中的更新合并到 SQL Server 上的“主”[ExchangeRates] 表中的传递查询

MERGE dbo.ExchangeRates AS target
USING dbo.ExchangeRateUpdates AS source
ON (target.CurrencyName = source.CurrencyName)
WHEN MATCHED THEN
    UPDATE SET CanadianDollarEquivalent = source.CanadianDollarEquivalent
WHEN NOT MATCHED THEN
    INSERT (CurrencyName, CanadianDollarEquivalent)
    VALUES (source.CurrencyName, source.CanadianDollarEquivalent);

(注意:定义 Pass-Through 查询时,请务必将其Returns Records属性设置为No。)

完成后,“主”[ExchangeRates] 表将包含

CurrencyName       CanadianDollarEquivalent
-----------------  ------------------------
European Euro                        1.3729
U. S. Dollar                          1.047
Australian Dollar                    0.9622
于 2013-06-27T21:16:37.597 回答