gpt4 book ai didi

sql-server-2008 - SQL MERGE 语句更新数据

转载 作者:行者123 更新时间:2023-12-03 05:41:57 25 4
gpt4 key购买 nike

我有一个表,其中包含名为energydata的数据

它只有三列

(webmeterID, DateTime, kWh)

我的表 temp_energydata 中有一组新的更新数据。

DateTimewebmeterID 保持不变。但 kWh 值需要从 temp_energydata 表更新。

如何以正确的方式为此编写 T-SQL?

最佳答案

假设您想要一个实际的 SQL Server MERGE声明:

MERGE INTO dbo.energydata WITH (HOLDLOCK) AS target
USING dbo.temp_energydata AS source
ON target.webmeterID = source.webmeterID
AND target.DateTime = source.DateTime
WHEN MATCHED THEN
UPDATE SET target.kWh = source.kWh
WHEN NOT MATCHED BY TARGET THEN
INSERT (webmeterID, DateTime, kWh)
VALUES (source.webmeterID, source.DateTime, source.kWh);

如果您还想删除目标中不在源中的记录:

MERGE INTO dbo.energydata WITH (HOLDLOCK) AS target
USING dbo.temp_energydata AS source
ON target.webmeterID = source.webmeterID
AND target.DateTime = source.DateTime
WHEN MATCHED THEN
UPDATE SET target.kWh = source.kWh
WHEN NOT MATCHED BY TARGET THEN
INSERT (webmeterID, DateTime, kWh)
VALUES (source.webmeterID, source.DateTime, source.kWh)
WHEN NOT MATCHED BY SOURCE THEN
DELETE;
<小时/>

因为这已经变得更流行了,我觉得我应该稍微扩展一下这个答案,并添加一些需要注意的警告。

首先,有几个博客报告concurrency issues with the MERGE statement在旧版本的 SQL Server 中。不知道以后的版本是否解决了这个问题。无论哪种方式,这在很大程度上可以通过指定 HOLDLOCKSERIALIZABLE 锁定提示来解决:

MERGE INTO dbo.energydata WITH (HOLDLOCK) AS target
[...]

您还可以使用更严格的事务隔离级别来完成同样的事情。

several other known issues合并。 (请注意,由于 Microsoft 取消了 Connect,并且没有将旧系统中的问题与新系统中的问题联系起来,因此这些较旧的问题很难追踪。谢谢 Microsoft!)据我所知,其中大多数问题并不常见问题或者可以使用与上面相同的锁定提示来解决,但我还没有测试过它们。

事实上,尽管我自己在使用 MERGE 语句时从未遇到过任何问题,但我现在总是使用 WITH (HOLDLOCK) 提示,而且我更喜欢仅在最简单的情况下使用该语句。

关于sql-server-2008 - SQL MERGE 语句更新数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14806768/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com