SQL Server列名批量转小写:查询语句无法识别大写列问题排查
解决SQL Server列名转小写查询无结果的问题
你的代码里SELECT语句查不到含大写字符的列,核心问题是WHERE子句用了不区分大小写(CI)的排序规则,导致即使列名有大写,c.name和LOWER(c.name)的比较也会被判定为相等,自然返回空结果。
修正方案
把WHERE条件里的排序规则改成**区分大小写(CS)**的版本,让数据库能识别大小写差异;同时建议用QUOTENAME处理表名和列名,避免遇到含特殊字符的表/列时报错。
修正后的完整代码
DECLARE @TableName NVARCHAR(128); DECLARE @OldColumnName NVARCHAR(128); DECLARE @NewColumnName NVARCHAR(128); DECLARE @SQL NVARCHAR(MAX); DECLARE ColumnCursor CURSOR FOR SELECT t.name AS TableName, c.name AS ColumnName FROM sys.columns c INNER JOIN sys.tables t ON c.object_id = t.object_id WHERE -- 改用区分大小写的排序规则做比较,识别大小写差异 c.name COLLATE SQL_Latin1_General_CP1_CS_AS <> LOWER(c.name) ORDER BY t.name, c.name; OPEN ColumnCursor; FETCH NEXT FROM ColumnCursor INTO @TableName, @OldColumnName; WHILE @@FETCH_STATUS = 0 BEGIN SET @NewColumnName = LOWER(@OldColumnName); -- 用QUOTENAME包裹对象名,避免特殊字符(比如空格、中括号)导致SQL语法错误 SET @SQL = 'EXEC sp_rename ' + QUOTENAME(@TableName + '.' + @OldColumnName, '''') + ', ' + QUOTENAME(@NewColumnName, '''') + ', ''COLUMN'';'; -- 先打印SQL语句确认修改逻辑,没问题再注释掉PRINT、打开EXEC PRINT @SQL; -- EXEC sp_executesql @SQL; FETCH NEXT FROM ColumnCursor INTO @TableName, @OldColumnName; END; CLOSE ColumnCursor; DEALLOCATE ColumnCursor;
操作注意事项
- 先单独执行游标里的SELECT语句,确认返回的列是你要修改的目标,避免误改
- 执行修改前务必备份数据库,
sp_rename操作不可逆 - 先通过PRINT预览要执行的SQL,确认无误后再执行EXEC
- 如果你的数据库默认排序规则已经是区分大小写的,可以去掉COLLATE语句,但保留的话兼容性更好
内容的提问来源于stack exchange,提问作者GCJH
相关产品推荐
相关产品推荐

