我面临重命名一个字段,其中相同的字段名在许多表中复制。
寻找将遍历所有表的脚本或免费/低成本工具,如果 fieldA 存在,则将其重命名为 fieldB。
谢谢
我面临重命名一个字段,其中相同的字段名在许多表中复制。
寻找将遍历所有表的脚本或免费/低成本工具,如果 fieldA 存在,则将其重命名为 fieldB。
谢谢
您可以使用 SQL Server 元数据表为您的目的创建动态 sql 语句。对于可用表的列表,您可以使用 sys.tables获取表列表,使用sys.columns获取列列表。使用这些表,您可以创建一个 sql 语句表。要执行动态 sql,您需要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
如果您还没有,请查看 VS2010 中的数据库项目类型。它具有许多使 DB 重构比使用 SQL Server Management Studio 更容易的功能。
例如,如果您重命名一个列,它将为所有引用旧列名的 FK 生成错误。它会进行大量构建时验证,以确保您的数据库对象不会引用不再存在的对象。而且因为所有数据库对象都只是保存为文本文件,所以像重命名这样的操作几乎只是搜索/替换。
此外,它具有非常方便的“同步”功能,可以比较 DB 项目脚本和数据库,生成 DIFF 报告,并生成脚本以在两者之间移动选定的更改(DB 项目到 SQL Server,反之亦然)。
说了这么多,它不会自动为您重命名——换句话说,当您重命名一个列时,它不会修复整个项目中对该列的所有引用。但是如果你犯了一个错误,当它验证数据库结构时你会得到构建错误。所以至少可以很容易地找到你需要改变的地方。
如果您使用的是 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