任何人都有以下解决方案吗? (两种情况下的代码片段应作为完整块运行)
以下代码模拟了日常处理作业的情况。
这是第1天
Declare @poitem_source table (PONum int, txt varchar(50), status varchar(25))
Declare @poitem_destination table (PONum int, LineNum int, txt varchar(50))
insert @poitem_source
values (1,'Item1', 'NEW'), (1,'Item2', 'NEW'),
(1,'Item3', 'NEW'), (2,'Item1', 'NEW'),
(2,'Item2', 'NEW')
update @poitem_source
set status = 'PROCESSING'
where status = 'NEW'
insert @poitem_destination
SELECT
PONum,
ROW_NUMBER() OVER (PARTITION BY PONum ORDER BY PONum) AS POLineNumber,
txt
FROM
@poitem_source
WHERE
status = 'PROCESSING'
update @poitem_source
set status = 'DONE'
where status = 'PROCESSING'
select *
from @poitem_destination
order by PONum, txt
如果您运行它,您将看到LineNum为目标表中的每个PONum递增1 ... n。
然而,这显然不适用于第2天......这里是代码......
Declare @poitem_source table (PONum int, txt varchar(50), status varchar(25))
Declare @poitem_destination table (PONum int, LineNum int, txt varchar(50))
insert @poitem_source
values (1,'Item1', 'NEW'), (1,'Item2', 'NEW'), (1,'Item3', 'NEW'),
(2,'Item1', 'NEW'), (2,'Item2', 'NEW')
update @poitem_source
set status = 'PROCESSING'
where status = 'NEW'
insert @poitem_destination
select
PONum,
ROW_NUMBER() OVER (PARTITION BY PONum ORDER BY PONum) AS POLineNumber,
txt
from
@poitem_source
where
status = 'PROCESSING'
update @poitem_source
set status = 'DONE'
where status = 'PROCESSING'
select *
from @poitem_destination
order by PONum, txt
--- 2nd day
insert @poitem_source
values (1,'Item4', 'NEW'), (2,'Item3', 'NEW')
update @poitem_source
set status = 'PROCESSING'
where status = 'NEW'
insert @poitem_destination
select
PONum,
ROW_NUMBER() OVER (PARTITION BY PONum ORDER BY PONum) AS POLineNumber,
txt
from @poitem_source
where status = 'PROCESSING'
update @poitem_source
set status = 'DONE'
where status = 'PROCESSING'
select *
from @poitem_destination
order by PONum, txt
对于第2天,附加项目的行号为1,因为选择查询没有以任何方式链接到目标表格(我不相信它可以)。
任何人都有另一种生成这些行号的解决方案吗?
由于
答案 0 :(得分:0)
将IDENTITY列添加到您的表中(这将是表的主键的良好候选者)。这将在表格中为其提供唯一的递增行号。然后,您可以维护每日行号。
像这样:
Declare @poitem_source table (ID int IDENTITY(1,1) NOT NULL PRIMARY KEY, PONum int, txt varchar(50), status varchar(25))
或者,您可以将行号列设为IDENTITY(1,1)
;然而,这将丢失数据,并可能导致你的问题(“我需要从第Y天开始的LineNumber X ......”现在将更难获得)。
答案 1 :(得分:0)
解决方案如下
/foo/
所以现在我们可以使用PONum& LineNum作为主键