规范化SQL表-将1行转换为6行



我有一个表,它由需要规范化的制造系统的数据填充。这个暂存表有一个键字段-LOTCODE-加上6个PARTSTATUS字段,一个PART1、PART2等的状态代码(INT(。

每小时我都想查询一次暂存表,对于找到的每一行,将6行插入到一个归档表中,该归档表将包含关键字字段LOTCODE和PARTLOCATION以及第三个字段PARTSTATUS。将数据插入存档表后,将删除暂存表中的行。

有没有一种方法可以只通过查询来实现这一点,或者我需要逐行循环遍历暂存表,在存档表中插入6行,然后删除原始行?

数据库为MS SQL 2016。制造系统每小时将向暂存表添加大约1440行。

暂存表示例行:

Lot, Part1Status, Part2Status, Part3Status, Part4Status, Part5Status, Part6Status
ABCDE, 1010, 1010, -50, 1010, 990, 1010

存档表格样本数据

Lot, PartLocation, Stats
ABCDE, 1, 1010
ABCDE, 2, 1010
ABCDE, 3, -50
ABCDE, 4, 1010
ABCDE, 5, 990
ABCDE, 6, 1010

这里有一个TRY/CATCH脚本,它在显式事务内部执行INSERTDELETE语句,其中XACT_ABORT已设置为ON,这确保在引发异常时完全回滚两个DML语句。像这样的

set nocount on;
set xact_abort on;
begin transaction
begin try
declare @lc         table(LOTCODE int   unique not null);
insert ArchiveTable(Lot, PartLocation, [Stats])
output inserted.LOTCODE into @lc
select LOTCODE, v.(
from StagingTable st
cross apply (values (1, st.Part1Status),
(2, st.Part2Status),
(3, st.Part3Status),
(4, st.Part4Status),
(5, st.Part5Status),
(6, st.Part6Status)) v(PARTLOCATION, [STATS]);
delete st
from StagingTable st
join @lc lc on st.LOTCODE=lc.LOTCODE;
commit transaction;
end try
begin catch
/* throw / raiserror / logging */
rollback transaction;
end catch

最新更新