隐藏数据库未使用表报错:必须声明标量变量@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
相关产品推荐
相关产品推荐

