-1

次のコードは機能しません。その理由はわかりません。

DECLARE @TableName varchar(100)
DECLARE @DBName varchar(50)
DECLARE @FinalTableName varchar(500)
DECLARE @TempDB  varchar(50)

SET @DBName=(select db_name())
SET @TableName = 'tbl_Product'
SET @FinalTableName = @DBName + '-' + @TableName +'-' + cast(CONVERT (date, GETDATE()) as varchar(100))
SET @TempDB = 'MiscDB.sys.objects'

Declare @SQL VarChar (250)
Declare @tableExist VarChar (200)

SET @SQL = 'select @tableExist =  OBJECT_ID FROM ' + @TempDB + ' WHERE object_id = OBJECT_ID(''' + @TableName + ''') AND type in (N''U'')'
exec @SQL

このエラーが発生します

メッセージ 911、レベル 16、状態 4、行 15
データベース 'select @tableExist = OBJECT_ID FROM MiscDB' が存在しません。名前が正しく入力されていることを確認してください。

ただし、SQL ステートメントを直接実行すると、機能します。

4

2 に答える 2

2

クエリはおそらく次のようになります。

DECLARE 
  @dbname      SYSNAME,
  @tablename   SYSNAME,
  @tableExists INT,
  @sql         NVARCHAR(MAX);

SELECT 
  @dbname    = N'Misc',
  @tablename = N'tbl_product';

SET @sql = N'SELECT @tableExists = [object_id]
    FROM ' + QUOTENAME(@dbname) + '.sys.tables 
    WHERE name = @tablename;';

EXEC sp_executesql @sql,
    N'@tableExists BIT OUTPUT, @tablename SYSNAME',
    @tableExists OUTPUT, @tablename;

PRINT @tableExists;

データベース名が固定されている場合(ハードコードされているようですMisc)、少し簡単です:

DECLARE 
  @tablename   SYSNAME,
  @tableExists INT,
  @sql         NVARCHAR(MAX);

SELECT 
  @tablename = N'tbl_product';

SET @sql = N'SELECT @tableExists = OBJECT_ID(@tablename, N''U'');';

EXEC Misc..sp_executesql @sql,
    N'@tableExists BIT OUTPUT, @tablename SYSNAME',
    @tableExists OUTPUT, @tablename;

PRINT @tableExists;
于 2012-07-10T18:01:58.977 に答える
0

いくつか問題があります -

1 つ目は、動的 SQL で記述されたものはすべて異なるスコープにあるということです。動的 SQL の内部では、動的 SQL の外部で宣言された変数を設定することはできません。

2 つ目は、OBJECT_ID() がデータベースによるものであることです。tbl_Product という名前のテーブルを持たない可能性が高いデータベースでこれを実行しています。

次のことを試してください。

SET @SQL = 'USE ' + @TempDB + ' select OBJECT_ID FROM ' + @TempDB + ' WHERE object_id = OBJECT_ID(''' + @TableName + ''') AND type in (N''U'')'
exec @SQL

これは基本的に、上から「今後は @TempDB を使用する」だけなので、これらのスコープの問題 (現在の接続の DB から ObjectId を見つけようとする) のいくつかに対処する必要はありません。スコープ内の変数は機能しません。

于 2012-07-10T18:05:41.460 に答える