SQL选择变量,导致变量值不正确

时间:2013-08-09 01:58:48

标签: sql sql-server-2008

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

第一次运行脚本时,组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

1 个答案:

答案 0 :(得分:2)

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

declare @v int = 1;

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

select @v;

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