我遇到了一个重大问题,基本上我有两个表,TableA和TableB
TableA我将插入然后更新
TableB是一个包含dateTokens,timeTokens,tokenOrder和
的表我已经声明了一个名为@taken的表,它复制了TableB并将其值放入其中。
我要做的是以下内容:
声明@taken表
将记录插入TableA
通过SCOPE_IDENTITY()
将TableB中的数据插入@taken,其中TableB为0(表B中的某些记录将被标记为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
非常感谢任何帮助。请帮助,我一直在为这一天努力奋斗
另外一件事,当我在运行此代码后转到TableB中的数据时,所有行都被标记为已采用,这是预期的。
答案 0 :(得分:0)
插入“TableA”后,它的身份值(@ TableA_PK = SCOPE_IDENTITY())增加1。
但是您使用“Row_Number()Over(Order By tokenOrder)”计算tokenOrder值,并且仅针对“take = 0”行计算。 每次从“1”开始。
这就是为什么这段代码每次运行都会跳过以前的行。
例如; 在第一个回合中,您将获得正确的结果。 但是在第二个回合中,你只需要“token = 2”行并跳过“token = 1”。