如何在SQL Server 2008中取消大小写敏感检查?

8

我刚刚安装了SQL Server 2008并导入了AdventureWorksDatabase(适用于SQL 2005,因为适用于2008的版本不起作用)。

现在当我搜索任何表、视图等时,它会强制执行区分大小写。因此,当写入Person.contact表时,会抛出“无效列名”的错误,但是当写入Person.Contact时,它会显示所有行。

此外,Intellisense也并不完美。

2个回答

13

大小写敏感性由数据库所使用的排序规则(collation)控制 - 通过查询系统目录视图来检查:

select name, collation_name 
from sys.databases

一个排序规则的名称可能是这样的:Latin1_General_CI_AS

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

你可以使用以下命令更改数据库的默认排序规则:

ALTER DATABASE AdventureWorks COLLATE ....... 

在此选择任何有效的排序规则 - 使用带有 _CI_ 的排序规则可以获得大小写不敏感的排序规则。

问题是:即使您在数据库级别上更改了排序规则,某些表仍可能具有创建表时定义了特定排序规则的单独列。您也可以更改所有这些内容,但那将是一项更大的任务。有关更多信息和用于检查和可能更改表中单独列的脚本,请参见此文章

智能感知可能无法正常工作的原因是,数据库对象的区分大小写本质上受服务器排序规则控制 - 该服务器排序规则可能与任何数据库默认排序规则不同。

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

SELECT SERVERPROPERTY('Collation')

更改服务器系统的排序规则是一个相当混乱的过程,需要使用原始的 setup.exe,如此处所述


2
这里的问题是表名“Contact”的大小写敏感。您应该将数据库AdventureWorks的“collation_name”设置为“Latin1_General_CI_AS”。
检查“collation_name”:
SELECT name, collation_name
FROM sys.databases
WHERE name = 'AdventureWorks';
GO

如果 collation_nameLatin1_General_BIN 或者 Latin1_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

或者

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

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接