【发布时间】:2016-12-12 22:02:43
【问题描述】:
假设您的数据库排序规则设置为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):
找不到对象“dbo.Employees”或者您没有权限。
【问题讨论】:
-
是的,我在正确的数据库中。需要单引号,因为这些 StoredProc 的参数是 NVARCHAR
-
@The_Black_Smurf 您确定列上的排序规则发生了变化吗?根据我的测试,更改数据库排序规则不会影响现有列。
标签: sql sql-server collation