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.
感谢您的时间.
下面是执行计划的图片
我不能用拉丁文整理来复制,但如果我使用克罗地亚语校对,因为在克罗地亚语(以及其他一些斯拉夫语言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有一个有向图".
| 归档时间: |
|
| 查看次数: |
124 次 |
| 最近记录: |