1

すべて、私は次の動的 SQL クエリを持っています

DECLARE @TableName NVARCHAR(255);
SET @TableName = 'BadCodesErrSumm';
DECLARE @DropSql NVARCHAR(MAX);
SET @DropSql = 
    'IF EXISTS (SELECT *  
                FROM Report.sys.objects 
                WHERE name = ''' + @TableName + ''' AND type = ''U'') 
     DROP TABLE [IPAReport]..[' + @TableName + '];'
PRINT @DropSql;
EXEC @DropSql;

これにより、次のエラーが発生します

Msg 203, Level 16, State 2, Line 11
The name 'IF EXISTS (SELECT *  
                FROM Report.sys.objects 
                WHERE name = 'BadCodesErrSumm' AND type = 'U') 
          DROP TABLE [Report]..[BadCodesErrSumm];' is not a valid identifier.

ただし、印刷出力は

IF EXISTS (SELECT *  
           FROM Report.sys.objects 
           WHERE name = 'BadCodesErrSumm' AND type = 'U') 
DROP TABLE [Report]..[BadCodesErrSumm];

正常に実行されます。私は何が欠けていますか?

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

4

1 に答える 1

5

使用する

EXEC sp_executesql @DropSql;

または

EXEC(@DropSql);

とはいえ、いくつかの提案:

DECLARE @TableName NVARCHAR(255);

SET @TableName = N'BadCodesErrSumm';      -- always use N prefix on Unicode strings

DECLARE @DropSql NVARCHAR(MAX);

SET @DropSql = N'IF EXISTS (SELECT 1      -- again, N prefix
                FROM IPAReport.sys.tables -- use sys.tables to avoid 'U' check
                WHERE name = @TableName)  -- use a proper parameter
     DROP TABLE [IPAReport]..' 
       + QUOTENAME(@TableName) + ';'      -- QUOTENAME is safer as @GSerg pointed out

PRINT @DropSql;

EXEC sp_executesql @DropSql, N'@TableName NVARCHAR(255)', @TableName;
于 2012-07-19T15:25:22.480 に答える