You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

隐藏数据库未使用表报错:必须声明标量变量@TableName

解决游标中执行sp_addextendedproperty时「必须声明标量变量@TableName」的错误

问题根源在于你脚本循环内部的GO语句。GO是SQL Server的批处理分隔符,每个批处理都是独立的执行单元,变量的作用域仅局限于当前批。把GO放在游标循环里,直接切断了@TableName变量的作用域,导致后续代码无法识别这个变量,同时也打乱了游标循环的执行逻辑。

修正方法很简单,移除循环内的GO即可,完整脚本如下:

use whatifdb
DECLARE @TableName varchar(100)

DECLARE cur CURSOR FOR SELECT 
    t.NAME AS TableName
FROM 
    sys.tables t
INNER JOIN 
    sys.partitions p ON t.object_id = p.OBJECT_ID 
WHERE 
    t.is_ms_shipped = 0
    AND p.rows = 0
ORDER BY 
    t.Name

OPEN cur

FETCH NEXT FROM cur INTO @TableName

WHILE @@FETCH_STATUS = 0 BEGIN

    EXEC sp_addextendedproperty 
        @name = N'microsoft_database_tools_support',
        @value = 'Hide',
        @level0type = N'Schema', @level0name = 'dbo',
        @level1type = N'Table', @level1name = @TableName;

    FETCH NEXT FROM cur INTO @TableName
END

CLOSE cur    
DEALLOCATE cur

额外说明:

  • 移除GO后,@TableName的作用域覆盖整个循环,游标可以正常遍历每个空表并执行隐藏操作。
  • 注意sys.partitions.rows是近似行数统计,如果需要精准判断表是否为空,可以改用SELECT COUNT(*) FROM 表名的方式,但原查询逻辑若能满足你的需求,修正后即可正常运行。

内容的提问来源于stack exchange,提问作者Pete North

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 13:15:34