2012-12-06 16 views
12

मैं एसक्यूएल के इस सेट को चलाने के लिए कोशिश कर रहा हूँ Microsoft 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 एसक्यूएल सर्वर है, जो अपने वर्तमान सत्र नहीं है करने के लिए एक नया कनेक्शन (SPID) बनाता है, तो यह चर नहीं देख सकता। the documentation देखें।

असल में, आपको उस पैरामीटर को घोषित करना होगा जिसे आप कॉल में पास करना चाहते हैं, और इसे एक मूल्य दें। इस मामले में, दोनों को आउटपुट विनिर्देशक शामिल करना होगा।

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 
संबंधित मुद्दे