如何将MS SQL Server数据库中所有表的所有列名更改为大写?

3
有没有一种SQL语句可以将数据库中所有表的所有列名更改为大写?使用MS SQL Server。
我有一个SQL语句可以实现这个功能,但不确定是否正确。
  1. run SQL below

    select 'exec sp_rename '''+b.name+'.'+a.name+''','''+UPPER(a.name)+''',''column'''
    from syscolumns a, sysobjects b 
    where a.id=b.id and b.type='U' 
    order by b.name
    
  2. copy and execute the result above


惯例是将 SQL 关键字保留为大写,而将数据库对象(数据库、模式、表和列名)保留为小写(或混合大小写)。 - outis
大家好,我有一个 SQL 需要完成,但不确定是否正确。 - Ryan
为了确保安全,我会使用 QUOTENAME() 函数,就像这样:'...' + QUOTENAME(b.name) + '...'。我理解所有的 object_id 都是唯一的,因此 b.type='U' 过滤器是不必要的。 - Andriy M
我需要重新生成索引吗?因为在执行SQL之后出现了一些应用程序升级问题。 - Ryan
5个回答

4
如果您正在将一个应用程序从SQL Server 2000升级到较新的版本,并且在处理SQL Server大小写敏感性方面遇到困难,我建议您在对数据库进行大量更改之前查看SQL Server 2000兼容性设置。
在SQL Server 2008 Management Studio中:
1. 右键单击数据库,选择上下文菜单中的 "属性"。 2. 转到 "选项" 页面。 3. 在最上面的第三个下拉列表中,选择 "兼容性级别:SQL Server 2000"。
至少这是耗费时间的。
编辑:由于似乎OP正在将他的数据库从SQL Server 2005升级到SQL Server 2005上的“新”数据库,因此上述策略可能不是最优的。

是的,正如你所说,我正在升级一个应用程序,并且在处理大小写敏感性方面遇到了困难。我正在使用2005版本,并将研究相关设置。 - Ryan
我在ORACLE上制作了一个PL/SQL语句来进行更改,它运行良好。因此,我认为如果对其进行一些更改以适应SQL Server,它也可能很好地工作,但似乎PL/SQL与SQL Server中的SQL完全不同。 - Ryan
嗨,Simen,我正在升级一个应用程序,它在同一个区分大小写的SQL Server 2005上运行,旧应用程序使用小写列,而后来的应用程序使用大写列,这让应用程序设计师有点吓到我了。:( - Ryan
2
但我认为这个想法是,如果您将兼容性级别设置为2000,则对该数据库的查询不再区分大小写。这是SQL Server 2000的行为。顺便问一下:我在哪里可以向那个决定把所有查询都转换成大写字母的开发人员投反对票呢? :-) - Simen S
好的,如果旧应用程序数据库也是 SQL Server 2005 数据库,那么我猜使用 SQL Server 2000 兼容模式可能会破坏一些依赖于 SQL Server 2005 特性的数据库方面。如果有人了解更多信息,那将是很有趣的。 - Simen S

2
我不相信有一个命令可以完成这个任务。
但是,您应该能够编写一个查询来完成此操作,使用1或2个游标和以下类似的查询:
select t.name As TableName, c.Column_Name
from sys.tables t
INNER JOIN information_schema.columns c ON c.Table_Name = t.Name
ORDER BY t.name 

这将返回您数据库中的所有表和列。
然后使用:
sp_RENAME 'TableName.[OldColumnName]' , '[NewColumnName]', 'COLUMN'

重命名每个列。


1

简短回答 - 不行。

如果你需要这样做(许多研究表明,所有大写名称都会降低可读性),你将不得不生成具有这些大写名称的新表,将数据从旧表复制到新表,删除旧表,重命名新表,并重新建立所有外键关系。

这样做有好的理由吗?


1
扩展Bravax的答案,这将给你一个要执行的命令列表。
select 'sp_RENAME ''' + t.name + '.' + QUOTENAME(c.Column_Name) + ''', ''' + UPPER(c.Column_Name) + ''', ''COLUMN'';\n go' As Command
from sys.tables t
INNER JOIN information_schema.columns c ON c.Table_Name = t.Name
ORDER BY t.name 

如果您正在批量运行,请在行之间添加“go”。

0
DECLARE @TableName VARCHAR(256) -- table name 
DECLARE @ColumnName VARCHAR(256) -- column name 
DECLARE @sqlstring nvarchar(512) -- sql to execute

DECLARE db_cursor CURSOR FOR 
select t.name, c.Column_Name
from sys.tables t
INNER JOIN information_schema.columns c ON c.Table_Name = t.Name
ORDER BY t.name

OPEN db_cursor  
FETCH NEXT FROM db_cursor INTO @TableName,  @ColumnName

WHILE @@FETCH_STATUS = 0  
BEGIN  
      set @sqlstring = N'sp_rename '''+ @TableName + '.' + QUOTENAME(@ColumnName) + ''', ''' + UPPER(@ColumnName) + ''', ''COLUMN''';

      EXECUTE sp_executesql @sqlstring;

      FETCH NEXT FROM db_cursor INTO @TableName,  @ColumnName
END 

CLOSE db_cursor  
DEALLOCATE db_cursor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接