SQL报错137:必须声明标量变量@sql,求脚本问题排查方案
问题解决:SQL Error (137): Must declare the scalar variable "@sql"
报错原因分析
- 版本兼容问题:如果你的SQL Server版本低于2008,不支持
DECLARE @sql nvarchar(MAX) = ''这种变量声明时直接赋值的语法,导致变量未被正确初始化。另外SQL Server 2000及更早版本不支持nvarchar(MAX)类型,会触发MAX未定义的错误。 - 无匹配数据时的变量状态:如果没有找到列名为
id_card_number的默认约束,SELECT @sql += ...语句不会执行,此时@sql会保持NULL状态,执行Sp_executesql时会触发类似“未声明变量”的报错。
修正后的代码
-- 兼容旧版本的变量声明与初始化 DECLARE @sql nvarchar(MAX) SET @sql = '' SELECT @sql += 'ALTER TABLE ' + Quotename(tbl.name) + ' DROP CONSTRAINT ' + Quotename(cons.name) + ';' FROM SYS.DEFAULT_CONSTRAINTS cons JOIN SYS.COLUMNS col ON col.default_object_id = cons.object_id JOIN SYS.TABLES tbl ON tbl.object_id = col.object_id WHERE col.[name] IN ('id_card_number'); -- 仅当生成有效SQL语句时执行 IF @sql <> '' EXEC Sp_executesql @sql
额外适配说明
- 若使用SQL Server 2000:将
nvarchar(MAX)替换为nvarchar(4000)(2000版本不支持MAX类型),如果生成的SQL语句长度超过4000字符,需要额外处理字符串拼接逻辑。 - 分开声明与赋值的写法,确保在所有支持的SQL Server版本中变量都能被正确初始化,避免版本兼容问题。
内容的提问来源于stack exchange,提问作者ilhan
相关产品推荐
相关产品推荐

