Sql 如何在具有不区分大小写排序规则的数据库上使外键区分大小写?

Sql 如何在具有不区分大小写排序规则的数据库上使外键区分大小写?,sql,sql-server-2008,foreign-keys,collation,Sql,Sql Server 2008,Foreign Keys,Collation,我有一个带有CI默认排序规则的数据库(French\u CI\u AS) 在这个排序规则下,SQL Server将对我的外键执行不区分大小写的检查,这是有道理的,但给我带来了很多问题,主要是因为字符串比较在我的数据库层和应用程序层中没有相同的行为 我大概有20个varcharPKs和数百个fk在varcharPKs上(是的,我知道只使用bigint,因为PKs本来可以避免这个问题,但是从varchar移动到bigint在这里不是一个选项) 解决这个问题最简单的方法是什么?我使用的是SQL Ser

我有一个带有CI默认排序规则的数据库(
French\u CI\u AS

在这个排序规则下,SQL Server将对我的外键执行不区分大小写的检查,这是有道理的,但给我带来了很多问题,主要是因为字符串比较在我的数据库层和应用程序层中没有相同的行为

我大概有20个
varchar
PKs和数百个fk在
varchar
PKs上(是的,我知道只使用
bigint
,因为PKs本来可以避免这个问题,但是从
varchar
移动到
bigint
在这里不是一个选项)


解决这个问题最简单的方法是什么?我使用的是SQL Server 2008。

您可以尝试将列的排序规则更改为区分大小写,但在联接或比较中使用该列时,需要将该列(或其他列)强制转换为同一列

只要比较字段,就可以将pk和fk强制转换为varbinary(varchar length)

比如:

Where CAST(yourPK As VarBinary(20)) = CAST(yourFK As VarBinary(20))

你不能。如果数据库排序规则不区分大小写,则所有比较(由FK->PK链接使用)都不区分大小写。。。。没有“魔法”来改变这一切。。。。是的-使用
varchar
作为主键是一个非常糟糕的主意-这只是不应该使用
varchar
作为主键的众多原因之一…..列定义中的COLLATE不会有帮助吗<代码>创建表。。。列名整理整理列名?@marc\u s:当然可以。例如,我可以将整个数据库的排序规则更改为区分大小写。我只是想找到一种尽可能轻松的方法来实现我的初始目标……实际上,SQL Server将要求外键列和引用列具有相同的排序规则,因此联接不需要强制转换。