Подтвердить что ты не робот

SQL Server - переменная объявлена, но все еще говорит: "Должен объявить скалярную переменную"

Я пытаюсь запустить этот набор команд SQL на Microsoft SQL Server, но я получаю эту ошибку:

Msg 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 
4b9b3361

Ответ 1

EXEC/sp_executesql создает новое соединение (SPID) на SQL Server, которое не является вашим текущим сеансом, поэтому оно не может видеть переменную. Проверьте документацию.

В принципе, вы должны объявить параметр, который хотите передать в вызов, и дать ему значение. В этом случае оба должны включать спецификатор OUTPUT.

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

Ответ 2

Проблема здесь:

  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