我无法弄清楚为什么将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。
谢谢您的时间。
下面是执行计划的图片
答案 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
是有向图的任何排序规则”。