我一直在阅读有关SQL排序规则的信息,但我仍然感到困惑。为什么此代码可以正常工作:
...case WHEN _AccountID not in ('00000000P','0000000P9','899') THEN 'blah'
,但是以下操作无效并产生错误消息
“无法解决之间的排序规则冲突 在“ SQL_Latin1_General_CP1_CS_AS”和“ SQL_Latin1_General_CP1_CI_AS”中 等于操作”
...case WHEN _AccountID not in (select _AccountID from tMyTable) THEN 'blah'
尤其是当其余查询完全相同时!
实际上,我可以编写其他查询,即使后者的语法也可以正常工作(因此,我认为这不是因为实际的列值,对吗?),但是我上面的示例均来自其他完全相同的查询。我无法理解在数据中寻找足够多的内容来区分工作范围和不工作范围的查询。
答案 0 :(得分:1)
排序规则用于确定排序顺序和区分大小写之类的内容。可以在服务器,数据库,表和列级别设置排序规则。因此,一个表中的两列可能具有不同的排序规则。在您的错误消息中,一种排序规则不区分大小写( CI ),而一种排序规则则区分大小写( CS )。从您发布的信息中我们还不知道,是存储在服务器/数据库/表中的两列称为_AccountID。但是,它们具有不同的排序规则。 CI和CS在BOL中的寻址方式如下:
区分大小写字母。如果选中, 小写字母排在大写字母之前。如果这 如果未选择选项,则排序规则不区分大小写。那是, SQL Server考虑字母的大写和小写版本 为了排序目的是相同的。您可以明确选择大小写 通过指定_CI不敏感。
一种解决方法是,假设第一个_AccountID的排序规则与数据库的默认排序规则不同(第二个_AccountID使用数据库的默认排序规则),
...case WHEN _AccountID collate database_default not in (select _AccountID from tMyTable) THEN 'blah'
顺便说一句,假设您正在使用SQL Server,则可能要考虑使用
WHERE NOT EXISTS (SELECT * FROM from tMyTable tbl WHERE tbl._AccountID = <the_other>._AccountID)
...表现将优于WHERE NOT IN (SELECT...)