1

SQL IN ステートメントを WHERE 句の一部として使用するときに発生した問題 (幸いなことに、ライブではなくテスト環境で) について人々に警告したかったのです。

[dataimport].[IDsToUpdate] という名前の一時テーブルを作成しました。このテーブルには、次の UPDATE ステートメントを使用して更新したい 42 個の GUID のリストが含まれていました。

UPDATE dbo.IndividualSponsors
SET LeaveDate = null
WHERE IndividualSponsorID in (select IndividualSponsorID from [dataimport].[IDsToUpdate])

この[dataimport].[IDsToUpdate]テーブルには、IndvSponsorID と呼ばれる単一の GUID 列が含まれています。UPDATE ステートメントのエラーに注意してください。次のようになっているはずです。

select IndvSponsorID from [dataimport].IDsToUpdate

単独で実行すると、 (予想どおり) 列が不明select IndividualSponsorID from [dataimport].IDsToUpdateであるというエラーが表示されます。IndividualSponsorID

しかし、上記の UPDATE ステートメント内で実行すると、dbo.IndividualSponsorsテーブル内の 148,000 レコードすべてが更新されました (arrrhhh !!!)。

これはIndividualSponsorID、テーブル dbo.IndividualSponsors に列名が存在し、UPDATE ステートメントの完全なコンテキストで実行すると、SQL Server がそのテーブルへの列参照を再ポイントしているためであると考えられます。したがって、すべての行が一括更新されます。

IndividualSponsorID特に列が FROM the tableであると明示的に述べたので、これは私には非常に間違っているようです[dataimport].IDsToUpdate。私のIN SELECTステートメントが間違っていたので、エラーが発生したはずです。

士気: 更新を行うときは常にテーブルのエイリアス名を使用してください (特にライブ データに対して!):

例えばselect ids.IndividualSponsorID from [dataimport].IDsToUpdate ids

これは期待どおりに失敗します。

これについて別の見解を持っている人はいますか?

4

1 に答える 1