我刚刚安装了SQL Server 2008并导入了AdventureWorksDatabase(对于SQL 2005,与2008年一样没有用)。
现在,当我搜索任何表格,视图等时,它会强制区分大小写 因此,写入时的Person.contact表会抛出无效列名的错误,但是当写入Person.Contact时,它会显示所有行。
此外,智能感知也不会很好。
答案 0 :(得分:12)
区分大小写由数据库使用的排序规则控制 - 通过查询系统目录视图来检查:
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。
答案 1 :(得分:2)
这里的问题是表名联系的区分大小写。您应该将数据库AdventureWorks的collation_name
设置为Latin1_General_CI_AS
检查collation_name:
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
或
您可以更改数据库属性中的排序规则。