如何在 SQL Server 2008 中删除区分大小写的检查?

Posted

技术标签:

【中文标题】如何在 SQL Server 2008 中删除区分大小写的检查?【英文标题】:How to remove Case Sensitive check in SQL Server 2008? 【发布时间】:2011-03-12 16:10:19 【问题描述】:

我刚刚安装了 SQL Server 2008 并导入了 AdventureWorksDatabase(对于 SQL 2005,对于 2008 不起作用)。

当我搜索任何表、视图等时,它现在强制区分大小写 因此 Person.contact 表在写入时会抛出 Invalid column name 的错误,但在写入 Person.Contact 时会显示所有行。

另外,智能感知也不能很好地工作。

【问题讨论】:

【参考方案1】:

区分大小写由数据库使用的排序规则控制 - 通过查询系统目录视图进行检查:

select name, collation_name 
from sys.databases

排序规则名称类似于:Latin1_General_CI_AS

_CI_ 部分在这里告诉我这是一个 不区分大小写 排序规则。如果您看到_CS_,那么它是一个区分大小写的排序规则。

您可以使用以下方法更改数据库的默认排序规则:

ALTER DATABASE AdventureWorks COLLATE ....... 

并在此处选择任何有效的排序规则 - 使用带有 _CI_ 的排序规则以获得不区分大小写的排序规则。

问题是:即使您更改了数据库级别的排序规则,某些表可能仍然具有在创建表时定义了特定排序规则的个别列。你也可以改变所有这些,但这将是一项更大的任务。请参阅this article 了解更多信息以及用于检查和可能更改表格中各个列的脚本。

智能感知可能无法正常工作的原因是数据库对象本身的大小写敏感性由服务器排序规则控制——这又可能不同于任何数据库默认值。

要找出服务器的排序规则,请使用:

SELECT SERVERPROPERTY('Collation')

更改服务器的系统排序规则是一个相当麻烦的过程,需要您将原始的setup.exe 用作explained here。

【讨论】:

【参考方案2】:

这里的问题是表名Contact 的大小写敏感性。您应该将 Database AdventureWorks 的 collation_name 设置为 Latin1_General_CI_AS

检查 collat​​ion_name:

SELECT name, collation_name
FROM sys.databases
WHERE name = 'AdventureWorks';
GO

如果collation_nameLatin1_General_BINLatin1_General_CS_AS,请将其更改为Latin1_General_CI_AS

ALTER DATABASE AdventureWorks
COLLATE Latin1_General_CI_AS ;
GO

如果数据库已锁定以执行此操作 “无法以独占方式锁定数据库以执行该操作。” .将数据库更改为单用户

ALTER DATABASE AdventureWorks SET SINGLE_USER WITH ROLLBACK IMMEDIATE 

然后做

ALTER DATABASE AdventureWorks
COLLATE Latin1_General_CI_AS ;
GO

最终将数据库恢复为多用户

ALTER DATABASE AdventureWorks SET MULTI_USER WITH ROLLBACK IMMEDIATE

或者

您可以在数据库属性中更改排序规则。

【讨论】:

以上是关于如何在 SQL Server 2008 中删除区分大小写的检查?的主要内容,如果未能解决你的问题,请参考以下文章