-2

我遇到的问题是选择似乎使用变量的旧值,但仅当值不存在时。

脚本的第一次运行,表中没有组 ID,因此两个 select 语句都应返回 AnswerGroupID = NULL。然后脚本的后续运行两个组都应该存在,并且查询返回一个有效的 int,然后在重新创建之前使用它来删除。

我有一个解决方法,但我想了解发生了什么问题,以防止将来出现此类错误。

表的基本结构是: 答案表有一个答案列表(每个答案一行),所有答案都通过组 ID(int 列)链接。AnswerGroup 表具有组级属性(groupID 是普通的 int 列,表具有单独的主键)

使用 SQL Server 2008。

--comments to cut out irrelevant code

DECLARE @GroupNameToAdd VARCHAR(100)
DECLARE @AnswerGroupID INT

SET @GroupNameToAdd = 'group1'
PRINT @GroupNameToAdd -- prints 'group1'

select @AnswerGroupID = a.groupID
from mySchema.Answers a
join mySchema.AnswerGroup ag
on a.groupID = ag.groupID
where a.AnswerValue = @GroupNameToAdd

-- ** result of above query is null first time
-- ** result of above query is 1234 subsequent times

-- if (@AnswerGroupID is not null, delete existing entries)
-- add new entry
SET @AnswerGroupID = MAX(groupID)+1
FROM mySchema.AnswerGroup

-- ** result of above query would now be 1234 if re-run here**

SET @GroupNameToAdd = 'group2'
PRINT @GroupNameToAdd -- prints 'group2'

select @AnswerGroupID = a.groupID
from mySchema.Answers a
join mySchema.AnswerGroup ag
on a.groupID = ag.groupID
where a.AnswerValue = @GroupNameToAdd

-- ** HERE IT SELECTS 1234 first time (as if it was using old value of @GroupNameToAdd) when it should be NULL
-- ** subsequent times it selects 1235 (correctly)

-- if (@AnswerGroupID is not null, delete existing entries)
-- add new entry includes line:

由于选择不正确,查询会删除新插入的第一个条目。

解决方法:

在第二个选择语句之前

SET @AnswerGroupID = NULL
4

1 回答 1

2

这是一个猜测。如果查询没有返回任何行,则不会发生分配。因此,以下返回“1”:

declare @v int = 1;

select @v = 2
from (select 10 as c) t
where c = 2;

select @v;

在第二个查询中,您在插入一行@GroupNameToAdd 后进行设置。据推测,新名称不在查询使用的表中。因此,查询没有匹配项,因此@AnswerGroupID不会被重新分配。

于 2013-08-09T02:07:14.297 回答