SQL尝试使用声明的表中的唯一值更新记录

时间:2017-04-05 19:01:33

标签: sql sql-server stored-procedures

我遇到了一个重大问题,基本上我有两个表,TableA和TableB

TableA我将插入然后更新

TableB是一个包含dateTokens,timeTokens,tokenOrder和

的表

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

我要做的是以下内容:

  1. 声明@taken表

  2. 将记录插入TableA

  3. 通过SCOPE_IDENTITY()

  4. 从刚插入TableA的记录中获取ID
  5. 将TableB中的数据插入@taken,其中TableB为0(表B中的某些记录将被标记为1,所以我只想要未记录的记录)同样在这一步中,我重做tokenOrder通过Row_Number()Over(Order By tokenOrder)作为tokenOrder。

  6. 从@taken表中选择新的tokenOrder等于TableA中新插入行的ID

  7. 使用timeToken和dateToken更新TableA其中id等于TableA中新插入行的ID

  8. 更新TableB timeToken和dateToken,其中tokenOrder等于TableA中新插入行的ID

  9. 我的问题是这个代码在一个存储过程中,我将调用存储在一个循环中,循环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
    

    所以它似乎每隔一次跳过一次,我不知道为什么

    这是我的代码:

    @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中的数据时,所有行都被标记为已采用,这是预期的。

1 个答案:

答案 0 :(得分:0)

插入“TableA”后,它的身份值(@ TableA_PK = SCOPE_IDENTITY())增加1。

但是您使用“Row_Number()Over(Order By tokenOrder)”计算tokenOrder值,并且仅针对“take = 0”行计算。 每次从“1”开始。

这就是为什么这段代码每次运行都会跳过以前的行。

例如; 在第一个回合中,您将获得正确的结果。 但是在第二个回合中,你只需要“token = 2”行并跳过“token = 1”。