0

我面临重命名字段,其中相同的字段名跨多个表进行复制。许多数据库表中的重构重命名字段

寻找将通过所有表的脚本或免费/低成本工具,如果fieldA存在,将其重命名为fieldB。

谢谢

+0

该字段是否有约束?一个或多个数据库中的表? –

+0

一次一个数据库是好的。没有限制。 –

回答

2

您可以使用SQL Server元数据表为您的目的创建动态sql语句。 有关可用表的列表,可以使用sys.tables获取表列表和sys.columns获取列表。使用这些表可以创建一个sql语句表。要执行动态sqls,您需要sp_executesql存储过程。

这是一个示例代码,只是为了演示如何使用元数据表和sp_executesql: 并注意我使用了其他更适合我的元数据表。你也可以使用游标来运行查询返回的所有脚本。

CREATE Database TestDB 

CREATE Table Table1 (Id int , fieldA varchar(50)) 

Declare @update_query nvarchar(max) 

select 
    @update_query = 'sp_rename ''' + t.TABLE_NAME + '.' + c.COLUMN_NAME + ''',''' + 'fieldB' + '''' 
From INFORMATION_SCHEMA.COLUMNS c JOIN INFORMATION_SCHEMA.Tables t ON c.TABLE_CATALOG = t.TABLE_CATALOG AND c.TABLE_SCHEMA = t.TABLE_SCHEMA AND c.TABLE_NAME = t.TABLE_NAME 
WHERE 
    c.COLUMN_NAME = 'fieldA' 

SELECT @update_query 

EXEC sp_executesql @update_query 
+0

看起来我会用这个作为基础来制作我自己的工具集。 –

1

看看VS2010中的数据库项目类型,如果还没有的话。它具有很多使数据库重构比使用SQL Server Management Studio更容易的功能。

例如,如果您重命名某个列,它将为所有引用旧列名称的FK提供构建错误。并且它会进行大量的构建时验证,以确保您的数据库对象不会引用不再存在的对象。而且因为所有的数据库对象都保存为文本文件,像重命名这样的操作几乎就是搜索/替换。

此外,它具有非常方便的“同步”功能,可以比较数据库项目脚本&数据库,生成DIFF报告并生成脚本以在两者之间移动选定的更改(无论是DB项目还是SQL Server,反之亦然)。

说了这么多之后,它不会自动为您进行重命名 - 换句话说,当您重命名列时,它不会在整个项目中修正对该列的所有引用。但是,如果你犯了一个错误,你将在验证数据库结构时发生构建错误。因此,至少可以轻松找到需要更改的地点。

+0

虽然我是一个沉重的VS用户。我想要独立的东西。 –

0

如果您使用的是Azure SQL Server,则可以使用Sam的答案和另一个输入参数sp_rename,@objtype ='COLUMN'。

Declare @update_query nvarchar(max) 

select 
    @update_query = 'sp_rename ''' + t.TABLE_NAME + '.' + c.COLUMN_NAME + ''',''' + 'fieldB' + ''',''' + 'COLUMN' + '''' 
From INFORMATION_SCHEMA.COLUMNS c JOIN INFORMATION_SCHEMA.Tables t ON c.TABLE_CATALOG = t.TABLE_CATALOG AND c.TABLE_SCHEMA = t.TABLE_SCHEMA AND c.TABLE_NAME = t.TABLE_NAME 
WHERE 
    c.COLUMN_NAME = 'fieldA' 

SELECT @update_query 

EXEC sp_executesql @update_query