-2

私が抱えている問題は、変数の古い値を使用しているように見える選択ですが、値が存在しない場合のみです。

スクリプトの最初の実行では、どちらのグループ ID もテーブルに含まれていないため、両方の select ステートメント自体が AnswerGroupID = NULL を返す必要があります。次に、スクリプトの後続の実行では、両方のグループが存在する必要があり、クエリは有効な int を返します。これは、再作成する前に削除するために使用されます。

回避策はありますが、今後このようなエラーを防ぐために何が問題なのかを理解したいと思います。

テーブルの基本構造は次のとおりです。 回答テーブルには、グループ ID (int 列) を介してすべてリンクされた回答のリスト (回答ごとに 1 行) があります。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:

選択が正しくないため、クエリは新しく挿入された最初のエントリを削除します。

回避策:

2 番目の選択ステートメントの前

SET @AnswerGroupID = NULL
4

1 に答える 1