【发布时间】:2017-08-31 13:27:42
【问题描述】:
我遇到了一个大问题,基本上我有两个表,TableA和TableB
TableA 我将插入然后更新
TableB 是一个包含 dateTokens、timeTokens、tokenOrder 和 take 的表
我已经声明了一个名为 @taken 的表,它复制 TableB 并将其值放入其中。
我想要做的是:
声明@taken 表
在 TableA 中插入一条记录
通过SCOPE_IDENTITY()从刚刚插入TableA的记录中获取ID
将TableB中的数据插入@taken中,其中从TableB中取为0(TableB中的一些记录会被标记为1,所以我只想要没有被取的记录)同样在这一步,我重做将 tokenOrder 通过 Row_Number() Over (Order By tokenOrder) 作为 tokenOrder。
从@taken 表中选择,其中新的tokenOrder 等于TableA 中新插入行的ID
使用 timeToken 和 dateToken 更新 TableA 其中 id 等于 TableA 中新插入行的 ID
更新 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