SQL与通配符一样,在某些字母上返回错误的结果

Djo*_*olo 2 sql t-sql sql-server wildcard sql-like

当使用带有通配符的like关键字时,我无法弄清楚为什么我得到错误的结果.为了讨论起见,我举了一些小例子来说明我的问题.假设我们有一些表格

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

INSERT INTO TestingLike VALUES ('A'), ('AB'), ('L') ,('LJ')
Run Code Online (Sandbox Code Playgroud)

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

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

SELECT [Name] FROM TestingLike WHERE [Name] LIKE 'L%'
Run Code Online (Sandbox Code Playgroud)

第一个查询返回(A,AB) ,而第二个返回只是大号.奇怪的是,使用临时表时不会发生这种情况

对于上帝的爱,有人可以解释为什么会发生这种情况,我做了一些研究,但是找不到答案,我使用SQL SERVER RC1 2017以及SQL SMS.

感谢您的时间.

下面是执行计划的图片

在此输入图像描述

Dam*_*ver 7

我不能用拉丁文整理来复制,但如果我使用克罗地亚语校对,因为在克罗地亚语(以及其他一些斯拉夫语言1)中,Lj是由两个字符组成的单个不同的字母,而不是 L后跟j.维基百科上的Lj(digraph)讨论了这一点

如果排序规则与tempdb显示问题的特定数据库的默认排序规则不同,则不会遇到与临时表/表变量相同的问题.

完整/自包含的repro脚本,适合在家玩的人:

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%'
Run Code Online (Sandbox Code Playgroud)

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


1我在答案中使用克罗地亚语,但当然,我的意思是"任何校对,其中Lj有一个有向图".