数据库归类更改后刷新 SYS.columns

Refreshing SYS.columns after db collation change

假设您的数据库排序规则设置为 French_CI_AS,并且您有一个 Employees table,其中 FirstName 列排序规则设置为 database_default。如果您 运行 以下代码将排序规则更改为 Latin1_General_CI_AIDATABASEPROPERTYEX 函数将 return Latin1_General_CI_AIsys.columns 仍将 return 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):

Could not find object 'dbo.Employees' or you do not have permission.

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

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