13

この一連のSQLコマンドをMicrosoftSQLServerで実行しようとしていますが、次のエラーが発生します。

メッセージ137、レベル15、状態1、行1
スカラー変数「@dbstatus」を宣言する必要があります。

変数を宣言したと思ったので、なぜそれでもエラーがスローされるのかわかりませんか?

DECLARE @dbname nvarchar(100) 
DECLARE @dbstatus varchar(500) 
DECLARE @sqlCommand NVARCHAR(1000) 
create table #temptable (dbname nvarchar(100), status varchar(500))

DECLARE c1 CURSOR READ_ONLY 
FOR 
   SELECT '[' + name + ']'   FROM sys.databases WHERE name = 'EDDS1084543'

OPEN c1  
FETCH NEXT FROM c1 INTO @dbname 

WHILE @@FETCH_STATUS = 0 
BEGIN            
      SET @sqlCommand = 'SET @dbstatus = (SELECT Status FROM ' + @dbname + '.[EDDSDBO].[dtSearchIndex])'   

      EXECUTE sp_executesql @sqlCommand

      INSERT INTO #tempTable(dbname, [status])VALUES (@dbname, @dbstatus)

      FETCH NEXT FROM c1 INTO @dbname   
END   

CLOSE c1 
DEALLOCATE c1 
4

2 に答える 2

9

EXEC/sp_executesql は、SQL Server への新しい接続 (SPID) を作成しますが、これは現在のセッションではないため、変数を認識できません。ドキュメントを確認してください。

基本的に、呼び出しに渡したいパラメーターを宣言し、それに値を与える必要があります。この場合、両方に OUTPUT 指定子を含める必要があります。

  EXECUTE sp_executesql @sqlCommand, '@dbstatus varchar(500) output', @dbstatus output
于 2012-12-06T19:06:21.997 に答える
4

問題はここにあります:

  SET @sqlCommand = 'SET @dbstatus = (SELECT Status FROM ' + @dbname + '.[EDDSDBO].[dtSearchIndex])'   
  EXECUTE sp_executesql @sqlCommand

これにより、サーバーは値を@sqlCommandスタンドアロンのステートメントとして実行します。このステートメント内で@dbstatusは、変数として宣言されていないため、エラーが発生します。これが実行されるものです:

SET @dbstatus = (SELECT Status FROM [value in @dbname].[EDDSDBO].[dtSearchIndex])

代わりにこれを試してください:

WHILE @@FETCH_STATUS = 0 
BEGIN            
      SET @sqlCommand = 'SET @dbstatus = (SELECT Status FROM ' + @dbname + '.[EDDSDBO].[dtSearchIndex])'   
      EXECUTE sp_executesql @sqlCommand, '@dbstatus varchar(500) output', @dbstatus output
      INSERT INTO #tempTable(dbname, [status])VALUES (@dbname, @dbstatus)
      FETCH NEXT FROM c1
      INTO @dbname   
END  
于 2012-12-06T19:06:33.627 に答える