与Sybase相比,如何在SQL server中按顺序管理订单?
我正在从SybaseIQ迁移到SQLServer2008,一个主要的差异观察者是ORDERBY子句。 在表上创建为与Sybase相比,如何在SQL server中按顺序管理订单?,sql,sql-server,sql-server-2008,sybase,Sql,Sql Server,Sql Server 2008,Sybase,我正在从SybaseIQ迁移到SQLServer2008,一个主要的差异观察者是ORDERBY子句。 在表上创建为create table test(名称varchar(20)) 插入一些记录: insert into test values('Hi') insert into test values('Toi') insert into test values('>Toi') insert into test values('iHh') insert into test values('
create table test(名称varchar(20))
插入一些记录:
insert into test values('Hi')
insert into test values('Toi')
insert into test values('>Toi')
insert into test values('iHh')
insert into test values('hi')
insert into test values('IhH')
insert into test values('1Hi')
insert into test values('2Hi')
在SQL Server和Sybase上执行的选择操作如下:
select * from test order by name desc
Sybase的结果是:
name
-------
iHh
hi
Toi
IhH
Hi
>Toi
2Hi
1Hi
SQL server的结果是:
name
-------
Toi
IhH
iHh
Hi
hi
2Hi
1Hi
>Toi
为什么SQL server和Sybase的顺序不同?如何在SQL server中管理order by(与Sybase相比)以获得相同的结果?您可以将排序规则用作SQL server默认排序规则,或使用order
子句的指定排序规则
二进制排序规则
二进制排序规则根据
由区域设置和数据类型定义的编码值。他们是
区分大小写。SQL Server中的二进制排序规则定义区域设置
以及将要使用的ANSI代码页。这将强制执行二进制排序
秩序。因为它们相对简单,所以二进制排序规则很有帮助
提高应用程序性能。对于非Unicode数据类型,数据
比较基于ANSI标准中定义的代码点
代码页。对于Unicode数据类型,数据比较基于
Unicode代码点。对于Unicode数据类型的二进制排序规则
在数据排序中不考虑区域设置。例如
拉丁字母1通用字母和日语字母产生相同的排序结果
当它们用于Unicode数据时
有两种类型的二进制文件
SQL Server中的排序规则;旧的BIN排序规则和新的BIN2
整理在BIN2排序规则中,所有字符都按照
它们的代码点。在BIN排序规则中,只有第一个字符是
根据代码点排序,剩余字符为
根据字节值排序。(因为英特尔平台是
一个小小的endian架构,Unicode代码字符总是
存储字节交换。)
或者只是
select * from @Test order by name collate Latin1_General_BIN2 desc
对列使用ASCII值,并按其降序排序。ASCII将对word的第一行进行排序,然后您可以对列应用排序
SELECT Name FROM @tblTest ORDER BY ASCII(Name) desc,Name
降序输出:
升序输出:
排序顺序不能由ASCII正确确定,因为它只返回最左边字符的代码。正如我在我的系统中测试过的那样,它符合op要求,所以我给出了答案当前数据库比较是
SQL\u Latin1\u General\u CP1\u CS\u as
,其他数据库需要区分大小写和重音request@Pravin可以为ORDER子句使用指定排序规则
SELECT Name FROM @tblTest ORDER BY ASCII(Name) desc,Name