我遇到的问题是选择似乎使用变量的旧值,但仅当值不存在时。
脚本的第一次运行,表中没有组 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