重构在许多数据库表中重命名字段

时间:2011-09-26 01:02:11

标签: sql-server sql-server-2008 refactoring refactoring-databases

我面临着重命名一个字段,其中在许多表中复制相同的字段名。

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

感谢

3 个答案:

答案 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

答案 1 :(得分:1)

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

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

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

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

答案 2 :(得分:0)

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

  TMF_Plugin_Type = $0 .. $FFFFFFFF;

  TMF_Plugin_Type_Rec = record
  const
    MF_Plugin_Type_MFT = 0;
    MF_Plugin_Type_MediaSource = 1;
    MF_Plugin_Type_MFT_MatchOutputType = 2;
    MF_Plugin_Type_Other = TMF_Plugin_Type($FFFFFFFF);
  end;