2017-04-05 69 views
2
我有一个重大问题

独特的价值来更新记录,基本上我有两个表,表A和表BSQL试图从申报表

表A,我将插入然后更新

表B是一个表用dateTokens,timeTokens,tokenOrder拍摄

我已经声明了一个名为@taken的表,它复制TableB并将其值放入其中。

我所试图做的是以下几点:

  1. 申报表@taken

  2. 插入记录表A

  3. 从刚插入记录获取ID通过SCOPE_IDENTITY()

  4. 将来自TableB的数据插入到@taken中,其中从TableB中获取的是0 (TableB中的一些记录将被标记为1,所以我只想要不记录的记录)同样在这一步中,我通过Row_Number()Over(Order By tokenOrder)将tokenOrder重做为tokenOrder。

  5. 从@taken表选择新tokenOrder在表A等于从新插入的行的ID

  6. 与timeToken和dateToken更新表A其中,ID是等于从新插入的行的ID在表A

  7. 更新表B timeToken和dateToken作为拍摄地点tokenOrder在表A等于从新插入的行的ID

我的问题是,这种代码在一个存储过程中,我将存储过程的调用放到一个循环中,循环了200次,当我运行它时,我得到了我期望的确切行数,但结果并不正确。

我的表B的数据看起来像这样

dateToken timeToken  tokenOrder taken 
Monday 1:00pm 1  0 
Monday 1:10pm 2  0 
Monday 1:20pm 3  0 

等一路到半夜10分钟内增加。 (有像3个小时的休息的地方在那里)

结果

dateToken timeToken 
Monday 1:10pm 
Monday 1:30pm 
Monday 1:50pm 
Monday 2:10pm 
Monday 2:30pm 

所以它似乎是跳过所有其他timeToken我得到的,当我跑我的存储过程,我不知道为什么

这里是我的代码:

@dateToken nvarchar(MAX) OUTPUT, 
@timeToken nvarchar(MAX) OUTPUT, 


Declare @TableA_PK BIGINT 

DECLARE @taken table( 
     id int NOT NULL, 
     dateToken nvarchar(max), 
     timeToken nvarchar(max), 
     tokenOrder int, 
     taken bit); 

INSERT INTO TableA (dateToken, timeToken) VALUES (‘’, ‘’) 

SET @TableA_PK=SCOPE_IDENTITY() 

INSERT INTO @taken SELECT id, dateToken, timeToken, Row_Number() Over (Order By tokenOrder) As tokenOrder, taken FROM TableB WHERE taken = 0 

SELECT @dateToken = dateToken, @timeToken = timeToken FROM @taken WHERE tokenOrder = @TableA_PK 

UPDATE TableA SET dateToken = @dateToken, timeToken = @timeToken WHERE id = @TableA_PK 

UPDATE TableB SET taken = 1 WHERE tokenOrder = @TableA_PK 

任何帮助将非常感激。请帮忙,我一直在为这一天苦苦挣扎

另一件事,当我运行这段代码后查看TableB中的数据时,所有的行都被标记为预期值。

回答

0

插入“TableA”后,其标识值(@ TableA_PK = SCOPE_IDENTITY())增加1。

但是你正在使用“Row_Number()Over(Order By tokenOrder)”计算tokenOrder值,并且只对“taken = 0”行计算。 每次从“1”开始。

这就是为什么此代码在每次运行时跳过以前的行。

例如; 在第一回合中,你会得到正确的结果。 但在第二回合中,您只需要“令牌= 2”行并跳过“令牌= 1”。