如何更新information_schema.columns

时间:2019-03-25 12:53:50

标签: sql-server tsql

无法更新information_schema.columns中的column_name列

我在MS-SQL服务器中有一个名为“ knd”的表。现在,我要以这种方式更改此表中所有列的列名:

例如,我在此表中的列名称为:燃料类别,燃料类型,结束日期,开始日期

我想将这些名称更新为[燃料类别],[燃料类型],[结束日期],[开始日期]。也就是说,列名必须包含[],并且更新操作应一次性完成。

我尝试过的事情:

update INFORMATION_SCHEMA.COLUMNS
Set COLUMN_NAME = CONCAT('[',COLUMN_NAME,']')
where TABLE_NAME = 'knd'

我收到以下错误:

不允许对系统目录进行临时更新。

我尝试按如下所示使用覆盖重新配置,但没有用:

exec sp_configure 'allow updates','1';
go
reconfigure with override
go

即使我必须使用exec sp_rename,我如何一次完成所有列的操作。我相信使用sp_rename需要更多的人工干预,因为我的列名可能会更改为明天。

有人可以帮忙做到这一点吗?

2 个答案:

答案 0 :(得分:1)

第一:这是一个可怕的主意,正如每个人在评论中所写。在列名称中添加方括号只会迫使您引用带有双方括号的列-要引用名为[fuel type]的列,则必须编写[[fuel type]]]

第二,您不能直接更新系统表或依赖于它们的视图。 sys模式和INFORMATION_SCHEMA模式中的所有内容均为只读。要在视图中重命名列,必须编写alter view语句,或使用sp_rename。要重命名表中的列,必须编写alter table语句或使用sp_rename
话虽如此,最好先找到所有要依赖于您要重命名的列的对象,因为重命名列不会重命名对它的每个引用,因此重命名时可能会破坏东西。
您可以查询内置表值函数sys.dm_sql_referencing_entities来获取SQL Server中对象的依赖性。

答案 1 :(得分:0)

在@ jeroen-mostert在上述评论之一中建议的情况下,地名在我的情况下是必需的!

下面是我的简单代码段,用于对我的表集中的所有列执行此操作。

Select  STUFF((SELECT N',' + QUOTENAME(C.COLUMN_NAME)
                  FROM INFORMATION_SCHEMA.COLUMNS C
                  WHERE C.TABLE_NAME = 'knd'
                  FOR XML PATH(N''),TYPE).value(N'.',N'nvarchar(MAX)'),1,1,N'')

结果如下:

[开始日期_(MM-DD-YYYY)],[结束日期_(MM-DD-YYYY)],[模式],[scac],[燃料类别],[燃料类型],[基本],[自动扶梯],[附加费],[FSC @ $ 3.2],[Step],[Co_ID]