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