動的 SQL は危険です。渡された値を SQL 文字列に直接代入したくありません。幸いなことに、あなたはすでにそれを知っているようです。
残念ながら、この場合、テーブル名に SQL パラメーターを使用できないという問題を発見しました。じゃあ何をすればいいの?動的に生成された SQL で渡された値を使用したくないが、通常の安全な方法でクエリに入れることはできません。
答えはルックアップ テーブルです。特定の各テーブルの名前を保持する「テーブル」テーブルを作成します。次のようになります。
CREATE TABLE [tables] (table_name sysname)
次に、次のようなクエリを作成できます。
SELECT @tblSpecific = table_name FROM [tables] WHERE table_name = @tblSpecific
かどうかを確認する必要@tblSpecific
がありNULL
ます。そうでない場合は、動的 SQL ステートメントで安全に使用できます (動的 SQL は最終的にここでの唯一のオプションです。ユーザー定義関数でさえ、あるレベルでそれを行う必要があります)。
ああ、もう 1 つ、ルックアップ テーブルの名前と型を選んだのは偶然ではありません。SQL 標準には、このようなテーブルが既にあります (とにかくビューです)。を使用するだけINFORMATION_SCHEMA.Tables
です。