SQL Sever 默认排序 like 和PATINDEX

small_tree 2010-08-13 01:48:37
有两条select 语句

1) select top 20 a.* from tb1 a where PATINDEX('%usd%',a.INSTRUMENT )>0 order by search_order
2) select top 20 a.* from tb1 a where a.INSTRUMENT like '%USD%' order by search_order


很诡异的问题出现了,

两条语句选出来的数据假设都是300条的top 20,但是在服务器A的排序和服务器B的排序就是不一样,也就是说选出的top 20 不一致,用sp_helpsort 查了一下,都是

Latin1-General, case-insensitive, accent-sensitive, kanatype-insensitive, width-insensitive for Unicode Data, SQL Server Sort Order 52 on Code Page 1252 for non-Unicode Data

Search_order字段的值都是1。

请教一下,当search_order的值都一样,为什么like 和paintindex 的默认排序会有所不同,非常郁闷的是,不能再制定一个字段排序,只能用默认排序,怎样让这两个的输出完全一样?

求高人指点

...全文
127 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
billpu 2010-08-13
  • 打赏
  • 举报
回复
在search_order上建聚集索引,不能是非聚集索引,试试
guguda2008 2010-08-13
  • 打赏
  • 举报
回复
那就按第二个字段排序,反正也是那个SB想要的结果。
small_tree 2010-08-13
  • 打赏
  • 举报
回复
仔细查了一下数据,去掉top, 用select *, 发现的问题是这样的,

1)select id,ticker,instrument,search_order from view_1 where instrument like '%usd%' order by search_order

这个结果有45 条,所有的search order 都是1, 但是排序的时候,会把ticker位NULL的放到前面

2)select id,ticker,instrument,search_order from view_1 where PATINDEX('%usd%',INSTRUMENT )>0 order by search_order

这个结果有45 条,所有的search order 都是1, 但是排序的时候,会把ticker位NULL的放到后面

ticker的类型是varchar(16)

实在不知道什么原因,在其它服务器上都是一样的,就是有一台服务器上不一样,出现了以上的排序方式,求解


small_tree 2010-08-13
  • 打赏
  • 举报
回复
好的,我试试set row count,我也觉得奇怪,其它几台服务器都一样就是那一台上面出来的结果不一样
obuntu 2010-08-13
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 small_tree 的回复:]

引用 8 楼 obuntu 的回复:

这样搞不知道有没有效。
SQL code

select * from (select top 20 a.* from tb1 a where a.INSTRUMENT like '%USD%' order by
search_order )
order by search_order


相当郁闷,无效。。。。。。
[/Quote]
如果不指定TOP子句,返回的结果会一样吗?,如果会的话,可以用set rowcount 20试试看
感觉没理由like和patindex不一样呢。
small_tree 2010-08-13
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 obuntu 的回复:]

这样搞不知道有没有效。
SQL code

select * from (select top 20 a.* from tb1 a where a.INSTRUMENT like '%USD%' order by
search_order )
order by search_order
[/Quote]

相当郁闷,无效。。。。。。
obuntu 2010-08-13
  • 打赏
  • 举报
回复
这样搞不知道有没有效。

select * from (select top 20 a.* from tb1 a where a.INSTRUMENT like '%USD%' order by
search_order )
order by search_order
small_tree 2010-08-13
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 billpu 的回复:]

不同是因为 patindex和like的内部算法不一样,当有重复数据大于top设定的参数时对数据页 索引等使用也有不同造成记录不匹配,楼主可以定义个视图或者可以再指定一个辅助列排序看看
[/Quote]

这个问题就是很极品在这里,不允许制定辅助排序,有个SB啊,竟然说默认排序就是它想要的,问题是那个sb都不知道默认排序时咋排的,就是他懒得再往下推敲,然后我这个小兵呀。。。就只能被它这么蹂躏糟蹋了
small_tree 2010-08-13
  • 打赏
  • 举报
回复
求解啊。。。。~~~~(>_<)~~~~
small_tree 2010-08-13
  • 打赏
  • 举报
回复
语句1)和语句2) 同事放在两台服务器中执行

1.
在服务器A中,1) 和2)是一样的
在服务器B中,1) 和2)的顺序是不一样的

2.
在服务器A中,1)和2)在search_order 都相同的情况下,是按照ID从小到大排序的

在服务器B中,PaintIndex的那条,在search_order 都相同的情况下,是按照ID从小到大排序
在服务器B中,like 的那条,在search_order 都相同的情况下,不是按照ID来排序的
billpu 2010-08-13
  • 打赏
  • 举报
回复
不同是因为 patindex和like的内部算法不一样,当有重复数据大于top设定的参数时对数据页 索引等使用也有不同造成记录不匹配,楼主可以定义个视图或者可以再指定一个辅助列排序看看
obuntu 2010-08-13
  • 打赏
  • 举报
回复
[Quote=引用楼主 small_tree 的回复:]
有两条select 语句

1) select top 20 a.* from tb1 a where PATINDEX('%usd%',a.INSTRUMENT )>0 order by search_order
2) select top 20 a.* from tb1 a where a.INSTRUMENT like '%USD%' order by search_order ……
[/Quote]

怎么个不一样法呢。
是语句1在服务器A执行,语句2在服务器B执行;
还是语句,1,2分别在服务器A,B上都执行?
small_tree 2010-08-13
  • 打赏
  • 举报
回复
咋没人理我?
small_tree 2010-08-13
  • 打赏
  • 举报
回复
在线等,求指教

22,206

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧