2012-12-06 69 views
12

Tôi đang cố gắng để chạy này tập hợp các câu lệnh SQL trên Microsoft SQL Server nhưng tôi nhận được lỗi này:SQL Server - Biến khai báo, nhưng vẫn nói "Phải khai báo các biến vô hướng"

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

Tôi nghĩ tôi đã khai báo biến vì vậy tôi không chắc chắn lý do tại sao nó vẫn còn ném lỗi?

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 

Trả lời

8

EXEC/sp_executesql tạo kết nối mới (SPID) cho SQL Server, không phải là phiên hiện tại của bạn, vì vậy nó không thể thấy biến. Kiểm tra the documentation.

Về cơ bản, bạn phải khai báo tham số bạn muốn chuyển vào cuộc gọi và đặt giá trị đó. Trong trường hợp này, cả hai phải bao gồm các specifier OUTPUT.

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

Vấn đề là ở đây:

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

Điều này làm cho máy chủ để thực hiện giá trị của @sqlCommand như một tuyên bố độc lập. Trong tuyên bố này, @dbstatus chưa được khai báo dưới dạng biến, do đó có lỗi. Đây là những gì đang nhận được thực hiện:

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

Hãy thử điều này thay vì:

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 
Các vấn đề liên quan