我刚刚安装了SQL Server 2008并导入了AdventureWorksDatabase(适用于SQL 2005,因为适用于2008的版本不起作用)。
现在当我搜索任何表、视图等时,它会强制执行区分大小写。因此,当写入Person.contact表时,会抛出“无效列名”的错误,但是当写入Person.Contact时,它会显示所有行。
此外,Intellisense也并不完美。
我刚刚安装了SQL Server 2008并导入了AdventureWorksDatabase(适用于SQL 2005,因为适用于2008的版本不起作用)。
现在当我搜索任何表、视图等时,它会强制执行区分大小写。因此,当写入Person.contact表时,会抛出“无效列名”的错误,但是当写入Person.Contact时,它会显示所有行。
此外,Intellisense也并不完美。
大小写敏感性由数据库所使用的排序规则(collation)控制 - 通过查询系统目录视图来检查:
select name, collation_name
from sys.databases
一个排序规则的名称可能是这样的:Latin1_General_CI_AS
这里的_CI_
部分告诉我它是一个不区分大小写的排序规则。如果你看到了_CS_
,那么它就是区分大小写的排序规则。
你可以使用以下命令更改数据库的默认排序规则:
ALTER DATABASE AdventureWorks COLLATE .......
在此选择任何有效的排序规则 - 使用带有 _CI_
的排序规则可以获得大小写不敏感的排序规则。
问题是:即使您在数据库级别上更改了排序规则,某些表仍可能具有创建表时定义了特定排序规则的单独列。您也可以更改所有这些内容,但那将是一项更大的任务。有关更多信息和用于检查和可能更改表中单独列的脚本,请参见此文章。
智能感知可能无法正常工作的原因是,数据库对象的区分大小写本质上受服务器排序规则控制 - 该服务器排序规则可能与任何数据库默认排序规则不同。
要找出服务器的排序规则,请使用以下命令:
SELECT SERVERPROPERTY('Collation')
更改服务器系统的排序规则是一个相当混乱的过程,需要使用原始的 setup.exe
,如此处所述。
SELECT name, collation_name
FROM sys.databases
WHERE name = 'AdventureWorks';
GO
如果 collation_name
是 Latin1_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
或者
您可以在数据库属性中更改排序规则。