【问题标题】:SQL Server - Variable declared but still says "Must declare the scalar variable"SQL Server - 已声明变量但仍显示“必须声明标量变量”
【发布时间】:2017-04-13 14:57:20
【问题描述】:

我正在尝试在 Microsoft SQL Server 上运行这组 SQL 命令,但出现此错误:

消息 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 

【问题讨论】:

    标签: sql-server


    【解决方案1】:

    EXEC/sp_executesql 创建一个到 SQL Server 的新连接 (SPID),这不是您当前的会话,因此它看不到变量。检查the documentation

    基本上,您必须声明要传递给调用的参数,并给它一个值。在这种情况下,两者都必须包含 OUTPUT 说明符。

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

    【讨论】:

    • 如果我只使用一个过程来获取三个(3)date 参数,然后基于它返回一个表,我将如何使用三个不同的参数?
    【解决方案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  
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多