0

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

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

谢谢

4

3 回答 3

2

您可以使用 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
于 2011-09-26T01:54:48.083 回答
1

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

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

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

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

于 2011-09-26T02:02:45.800 回答
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
于 2016-01-12T19:54:52.627 回答