【问题标题】:Refreshing SYS.columns after db collation change数据库排序规则更改后刷新 SYS.columns
【发布时间】:2016-12-12 22:02:43
【问题描述】:

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

找不到对象“dbo.Employees”或者您没有权限。

【问题讨论】:

  • 是的,我在正确的数据库中。需要单引号,因为这些 StoredProc 的参数是 NVARCHAR
  • @The_Black_Smurf 您确定列上的排序规则发生了变化吗?根据我的测试,更改数据库排序规则不会影响现有列。

标签: sql sql-server collation


【解决方案1】:

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

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

【讨论】:

  • 你是对的! SSMS 将显示<database default>,但这并不意味着列排序规则链接到数据库排序规则。如果您更改数据库排序规则并重新打开列属性,<database default> 将被替换为该列的实际排序规则。反之亦然:如果您更改数据库排序规则以匹配列排序规则,则 SSMS 将显示 <database default>
猜你喜欢
  • 2013-08-05
  • 1970-01-01
  • 1970-01-01
  • 2011-04-08
  • 2017-09-22
  • 2016-09-29
  • 1970-01-01
  • 2013-10-25
  • 2014-11-25
相关资源
最近更新 更多