假设您的数据库整理设置为 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_refreshsqlmodule
和sp_refreshview
StordProc:
EXEC sp_refreshsqlmodule N'dbo.Employees'
和
EXEC sp_refreshview N'dbo.Employees'
,但它们都引起了错误(使用SA帐户尝试,没有DBO):
找不到对象'dbo. employees'或您没有许可。
更改数据库平面图不会更改现有列。您需要ALTER TABLE
ALTER TABLE Employees
ALTER COLUMN FirstName VARCHAR(20) COLLATE Latin1_General_CI_AI