2012-12-06 11 views
12

Sto cercando di eseguire questa serie di comandi SQL in Microsoft SQL Server, ma sto ottenendo questo errore:SQL Server - variabile dichiarata ma ancora dice "Deve dichiarare la variabile scalare"

Msg 137, Level 15, State 1, Line 1
Must declare the scalar variable "@dbstatus".

Pensavo ha dichiarato la variabile quindi non sono sicuro del motivo per cui sta ancora generando l'errore?

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 

risposta

8

EXEC/sp_executesql crea una nuova connessione (SPID) per SQL Server, che non è la sessione corrente, in modo che non può vedere la variabile. Controllare the documentation.

In pratica, è necessario dichiarare il parametro che si desidera passare alla chiamata e assegnargli un valore. In questo caso, entrambi devono includere lo specificatore OUTPUT.

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

Il problema è qui:

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

Questo fa sì che il server per eseguire il valore della @sqlCommand come una dichiarazione standalone. All'interno di questa affermazione, @dbstatus non è stato dichiarato come variabile, quindi l'errore. Questo è ciò che sta facendo eseguire:

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

Prova a modificare:

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 
Problemi correlati