IDに基づいて行を削除したいとします。複数のテーブルでは、テーブル名とIDを受け入れて操作を実行する単一のクエリを生成したいと考えています。SQL Server 2008でケースステートメントを使用して削除
ここでは、if - else文を使用したくありません。私はcase文を使用してテーブル名を検出して関数を実行したい。
私を助けてください。
IDに基づいて行を削除したいとします。複数のテーブルでは、テーブル名とIDを受け入れて操作を実行する単一のクエリを生成したいと考えています。SQL Server 2008でケースステートメントを使用して削除
ここでは、if - else文を使用したくありません。私はcase文を使用してテーブル名を検出して関数を実行したい。
私を助けてください。
Martinによって言及されたように、直接行うことはできませんが、削除を実行するストアドプロシージャを記述することができます。
DELETE FROM TestTable WHERE ID = 1
と
EXEC SLOW_DELETE 'TestTable', 1
を比較
は(性能ドレインである以外)しかし大きな違いはありません。手順
をストアドは
CREATE PROCEDURE SLOW_DELETE(@TableName sysname, @ID INT) AS BEGIN IF ((SELECT COUNT(*) FROM sys.tables WHERE [email protected]) <> 1) BEGIN RAISERROR('Ambiguous or non existent table name passed %s',16,1,@TableName) RETURN END DECLARE @Stmt nvarchar(500) SET @Stmt = 'DELETE FROM ' + QUOTENAME(@TableName) + ' WHERE ID = @ID' EXEC sp_executesql @Stmt, N'@ID INT', @ID = @ID END
私はあなたがこのようなアプローチを使用してから獲得したいと考えていたのだろうか。おそらくあなたがあなたの動機を広げるならば、別のアプローチを提案することができます。
おっと! '@ TableName'は' sysname'でなければなりません。変数の型は 'nvarchar'でなければなりません。 'quote_name'が使われ、' @ Id'を持つ 'sp_executesql'がパラメータとして渡されます。 (SQLインジェクションの可能性を減らし、英数字だけではないオブジェクト名に対処するため) –
@Martin、まあまあです。私はあなたの(有効な)懸念事項に対処しようとしました。あなたは他の大切な間違いに気付いたら、私はあなたにそれらを言及すると確信しています:) –
その編集はまだ動作しませんでした。私はあなたの答えを編集するの自由を取ったあなたがそれが好きではない場合は、それをロールバックして自由に感じる! –
できません。大文字と小文字は、実行の流れを制御しないクエリで使用され、テーブル名は変数/パラメータ内の名前(動的なSQLを使用して文字列全体を構築することなく)から動的にパラメータ化または割り当てできません。 –