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
Ответы
Ответ 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