3

次の SQL Server ストアド プロシージャがあります。

CREATE PROCEDURE ispsDcOhcAgg @TmpTableName NVARCHAR(50), @ListItem NVARCHAR(50) 
AS
IF EXISTS (SELECT name 
           FROM sys.tables 
           WHERE name = @TmpTableName) 
DROP TABLE @TmpTableName; -- This will not work.
GO

これは明らかに機能しません (上記のスニピットのコメントを参照してください)。この問題を回避するために私が見つけた唯一の(そして非常に醜い)方法は、次のことです

CREATE PROCEDURE ispsDcOhcAgg @TmpTableName NVARCHAR(50), @ListItem NVARCHAR(50) 
AS
DECLARE @SQL NVARCHAR(4000) 
SET @SQL = N'IF EXISTS (SELECT name ' +
           N'FROM sys.tables ' + 
           N'WHERE name = N' + N'''' + @TmpTableName + N''') ' + 
           N'DROP TABLE ' + @TmpTableName + N';'
EXEC sp_executesql @SQL;
GO

これは本当に悪臭を放ち、大規模なストアド プロシージャの場合は恐ろしいことです。

私が知らないこれを行う別の方法はありますか?

御時間ありがとうございます。

4

2 に答える 2

6

いいえ、このようにテーブル名を動的に使用したい場合は、動的 SQL を使用する必要があります。

したがって、厄介な SQL インジェクションのリスクにさらされないように注意する必要があります。

次のようなことを試してください:

SET @SQL = 'IF EXISTS (SELECT name ' +
           N'FROM sys.tables ' + 
           N'WHERE name = @TableName) ' + 
           N'DROP TABLE ' + QUOTENAME(@TmpTableName) + ';'

EXEC sp_executesql @SQL, N'@TableName sysname', @TmpTableName;
于 2012-07-13T12:03:54.770 に答える
2

いいえ、実行時に削除するテーブルを決定したい場合、動的 SQL に代わるものはありません。

少し醜い方法があります: 動的にする必要があるコマンド (DROPコマンド)に対してのみ動的 SQL を使用します。

DECLARE @SQL NVARCHAR(100) 
IF EXISTS (SELECT name 
       FROM sys.tables 
       WHERE name = @TmpTableName) 
BEGIN
    SET @SQL = N'DROP TABLE ' + @TmpTableName + N';'
    EXEC sp_executesql @SQL;
END
于 2012-07-13T12:07:31.797 に答える