2012-12-06 141 views
12

我試圖運行這套SQL的Microsoft SQL Server的命令,但我收到此錯誤:SQL服務器 - 變量聲明,但仍然說「必須聲明標量變量」

Msg 137, Level 15, State 1, Line 1
Must declare the scalar variable "@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 

回答

8

EXEC/sp_executesql創建到SQL Server的新連接(SPID),這不是您當前的會話,因此它看不到變量。檢查the documentation

基本上,你必須聲明你想傳遞給調用的參數,並給它一個值。在這種情況下,兩者都必須包含OUTPUT說明符。

EXECUTE sp_executesql @sqlCommand, '@dbstatus varchar(500) output', @dbstatus output 
3

的問題是在這裏:

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