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

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;

操作注意事项

  1. 先单独执行游标里的SELECT语句,确认返回的列是你要修改的目标,避免误改
  2. 执行修改前务必备份数据库,sp_rename操作不可逆
  3. 先通过PRINT预览要执行的SQL,确认无误后再执行EXEC
  4. 如果你的数据库默认排序规则已经是区分大小写的,可以去掉COLLATE语句,但保留的话兼容性更好

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 09:42:35