【发布时间】:2021-08-18 18:56:06
【问题描述】:
我是新手,需要帮助。我有两个这两个表,如果有任何值发生更改或出现新记录,我需要比较并插入新行。
表Product 有主键ID:
ID | ProductCode | [ProductType] | [Margin]
005 | A320 | GAS | 0.05
006 | A110 | DIS | 0.15
007 | A310 | GAS | 0.04
还有表ProductHistory:
ID | ProductCode | ProductType | Margin | Version
006 | A110 | DIS | 1.01 | 1
005 | A320 | GAS | 0.05 | 0
006 | A110 | DIS | 0.15 | 0
007 | A310 | GAS | 0.04 | 0
表ProductHistory 保留表Product 的任何更改的所有记录。每次有任何变化,表ProductHistory中的列[Version]加1。
我正在编写MERGE 语句来检查表Product 中是否有任何新更改,然后在表[ProductHistory] 中插入新行并更新[Version] 编号。
这是我当前的代码
MERGE [ProductHistory] AS t
USING dbo.[Product] AS s
ON t.[ID] = s.[ID]
WHEN NOT MATCHED BY TARGET THEN
INSERT ([Id], [ProductCode], [ProductType], [Margin], [Version])
VALUES (s.[Id], s.[ProductCode], s.[ProductType], s.[Margin], 0)
WHEN MATCHED
AND (t.[ProductCode] <> s.[ProductCode] OR
t.[ProductType] <> s.[ProductType] OR
t.[Margin] <> s.[Margin])
THEN
UPDATE
SET [ID] = s.[ID]
,[ProductCode] = s.[ProductCode]
,[ProductType] = s.[ProductType]
,[Margin] = s.[Margin]
,[Version] = t.[Version] + 1
到目前为止,我的代码遇到了问题:
- 我需要将表
Product中的值与ProductHistory中的值与最大[版本] 号进行比较(代码中尚未解决) - 当
ID匹配但值发生变化时,我需要插入新记录并将[Version] 加一。但是这段代码没有做它应该做的事情。
关于如何解决这些帮助的任何帮助或建议!谢谢
【问题讨论】:
-
Sql Server 使用系统版本控制 为您提供开箱即用的功能,无需编写您自己的代码。
-
这是一个类项目,所以我不能使用这样的内置函数。 @Stu
-
很公平,在这种情况下,您只需要在
Products表上添加一个trigger即可进行插入和更新。我也不会使用merge并尝试维护版本号,只需在每次插入或更新的历史记录中插入一行,以获得完整的可见性;我仍然会看看数据库为您做了什么系统版本控制并遵循原则。 -
我认为您的方法与“历史”的概念不符。在大多数实现中,您记录一行的每个“版本”。在这里,您似乎只跟踪行的“先前”版本。这真的是你的目标吗?这似乎是底层架构实现,但在这种情况下合并不起作用,因为任何更改都会导致将新“版本”插入历史表。
-
@Stu 我可以看到他们只想维护历史的变化,而不是每次更新。
标签: sql sql-server