db collat​​ion更改后刷新SYS.columns

时间:2016-12-12 22:02:44

标签: sql sql-server collation

我们假设您的数据库排序规则设置为French_CI_AS,并且您有一个Employees表,其FirstName列排序规则设置为database_default。如果您运行以下代码将排序规则更改为Latin1_General_CI_AI,则DATABASEPROPERTYEX函数将返回Latin1_General_CI_AI,而sys.columns仍会返回French_CI_AS

ALTER DATABASE MyDB COLLATE Latin1_General_CI_AI;

SELECT DATABASEPROPERTYEX(DB_NAME(), 'Collation') AS DatabaseCollation
--Return Latin1_General_CI_AI

SELECT collation_name AS FieldCollation
FROM sys.columns
WHERE OBJECT_ID IN(SELECT object_id FROM sys.objects WHERE type = 'U' AND NAME = 'Employees')
AND NAME = 'FirstName';
--return French_CI_AS

如果您在几秒钟后运行相同的代码,sys.columns最终将会更新。但是,有没有办法强制更新sys.columns

我已经尝试了sp_refreshsqlmodulesp_refreshview StoredProc:

EXEC sp_refreshsqlmodule N'dbo.Employees'

EXEC sp_refreshview N'dbo.Employees'

但它们都会引发错误(尝试使用sa帐户而不使用dbo):

  

无法找到对象&#d ;.Employees'或者你没有得到许可。

1 个答案:

答案 0 :(得分:2)

更改数据库排序规则不会更改现有列。您需要ALTER TABLE

ALTER TABLE Employees
  ALTER COLUMN FirstName VARCHAR(20) COLLATE  Latin1_General_CI_AI