带有通配符的SQL Like在某些字母上返回错误结果

时间:2018-07-17 13:53:57

标签: sql sql-server tsql wildcard sql-like

我无法弄清楚为什么将like关键字与通配符一起使用时会得到错误的结果。 为了便于讨论,我举了一个小例子来说明我的问题。 假设我们有一些桌子

CREATE TABLE TestingLike(
[Name] VARCHAR(50)  
)

INSERT INTO TestingLike VALUES ('A'), ('AB'), ('L') ,('LJ')

现在,当我使用此搜索条件

SELECT [Name] FROM TestingLike WHERE [Name] LIKE 'A%'

SELECT [Name] FROM TestingLike WHERE [Name] LIKE 'L%'

第一个查询返回(A,AB),第二个查询仅返回 L 。 奇怪的是,使用临时表时不会发生这种情况

为了上帝的爱,有人可以解释为什么会这样吗, 我已经进行了一些研究,但找不到答案,我正在使用SQL SERVER RC1 2017和SQL SMS。

谢谢您的时间。

下面是执行计划的图片

enter image description here

1 个答案:

答案 0 :(得分:7)

我无法使用拉丁文排序规则进行复制,但是如果我使用克罗地亚语排序规则,则可以复制,因为在克罗地亚语(和其他斯拉夫语言 1 )中,Lj是单个不同的字母由两个字符组成,并且 not L后跟j。维基百科上的Lj (digraph)对此进行了讨论

如果tempdb的排序规则与出现问题的该特定数据库的默认排序规则不同,则临时表/表变量将不会遇到相同的问题。

针对在家中玩的人的完整/自包含复制脚本:

declare @TestingLike table(
[Name] VARCHAR(50) collate Croatian_CI_AI
)

INSERT INTO @TestingLike VALUES ('A'), ('AB'), ('L') ,('LJ')

SELECT [Name] FROM @TestingLike WHERE [Name] LIKE 'A%'

SELECT [Name] FROM @TestingLike WHERE [Name] LIKE 'L%'

如何“修复”这取决于您的总体目标。如果代码按照克罗地亚的规则运行,则可以正常工作。否则,您可能需要更改数据库的默认排序规则。 但是,默认排序规则仅在创建列时适用。因此,您还必须更改每个现有列以将排序规则更改为所需的排序规则。


1 我在回答中始终使用克罗地亚语,但我的意思是“ Lj是有向图的任何排序规则”。