【问题标题】:SQL trying to update record with unique value from declared tableSQL 尝试从声明的表中更新具有唯一值的记录
【发布时间】:2017-08-31 13:27:42
【问题描述】:

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

TableA 我将插入然后更新

TableB 是一个包含 dateTokens、timeTokens、tokenOrder 和 take 的表

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

我想要做的是:

  1. 声明@taken 表

  2. 在 TableA 中插入一条记录

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

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

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

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

  7. 更新 TableB 的 timeToken 和 dateToken,其中 tokenOrder 等于 TableA 中新插入行的 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

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

这是我的代码:

@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

任何帮助将不胜感激。请帮忙,我已经为此苦苦挣扎了几天ssss

另一件事,当我在运行此代码后查看 TableB 中的数据时,所有行都被标记为已使用,这是预期的。

【问题讨论】:

    标签: sql sql-server stored-procedures


    【解决方案1】:

    插入“TableA”后,它的标识值(@TableA_PK=SCOPE_IDENTITY())加一。

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

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

    例如; 在第一回合,你得到了正确的结果。 但在第二回合,你只取“token = 2”行并跳过“token = 1”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-22
      • 1970-01-01
      • 2022-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多