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
これは期待どおりに失敗します。
これについて別の見解を持っている人はいますか?