我们假设您的数据库排序规则设置为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
StoredProc:
EXEC sp_refreshsqlmodule N'dbo.Employees'
和
EXEC sp_refreshview N'dbo.Employees'
但它们都会引发错误(尝试使用sa帐户而不使用dbo):
无法找到对象&#d ;.Employees'或者你没有得到许可。
答案 0 :(得分:2)
更改数据库排序规则不会更改现有列。您需要ALTER TABLE
ALTER TABLE Employees
ALTER COLUMN FirstName VARCHAR(20) COLLATE Latin1_General_CI_AI