我有一个处理现有数据库的丑陋问题。此数据库有一个Transaction_Items
表,其中包含每个事务的行项目(简化):
Transaction_Item_ID(Identity - Auto) Transaction_ID Item_Name
-----------------------------------------------------------------
1 12345 Service1
2 12345 Service2
3 12345 Service3
4 12346 Service1
这些交易显示在发票上,应用程序始终根据Transaction_Item_ID
在该发票上订购。
我需要将服务项添加到始终首先显示的特定交易中,让我们调用其项名称MEMO
。否则,项目需要保持相同的顺序。因此,此MEMO
项始终需要具有与事务匹配的Transaction_Item_ID
中最低的Transaction_Item_ID
。因为Item_name
是一个自动标识列,所以我不能将其更改为较低的值。我认为我基本上需要将第一行MEMO
更新为Transaction_Item_ID(Identity - Auto) Transaction_ID Item_Name
-----------------------------------------------------------------
1 12345 MEMO
2 12345 Service1
3 12345 Service2
4 12346 Service1
5 12345 Service3
,同时将现有项目名称复制到下一个最低行,依此类推,直到将上一个最后一行值插入到新行中行。
问题是如何做到这一点,或者是否有更好的方法来实现相同的结果。
基本上就像这样结束:
Select top 1
Element1 = XV.value('(.)[1]','nvarchar(32)')
from @xml.nodes('Parameters/Parameter/Value') as x(XV)
编辑澄清:我无权更改使用此表的应用程序。我无法在表格中添加新列。
我知道身份值不能/不应该改变,因为这会导致混乱。这就是为什么我认为唯一的答案是"移动"项目名称值"向下"行。
是的,这很难看,远非理想。不幸的是,处理遗留应用程序并充分利用它是许多企业的现实。至少我实际上对数据库有读/写访问权。
答案 0 :(得分:1)
我不喜欢你更新每一行的想法。
此方案中最简单的解决方案是重命名此表并将其用作临时表,然后使用所需的顺序执行插入新表(具有原始表的名称)。
或者,更改应用程序中的顺序。