DECLARE @A VARCHAR(20), @B VARCHAR(20)
SET @A = '1702010070'
SET @B = '17-2007-0002'
IF @A > @B 
PRINT '“1702010070”大'
ELSE
PRINT '“17-2007-0002”大'在sqlserver中比较是“17-2007-0002”大
但在delphi中比较是“1702010070”大因为字符串前两位相同,在ASCII中第三位“0”比“-”大,所以我也认为是“1702010070”大,
可sqlserver认为是“17-2007-0002”大,我不清楚依据是什么,有没有办法使得“1702010070”比“17-2007-0002”大呢
因为数据库中涉及对某个字段排序,所以才发现以上问题

解决方案 »

  1.   


    declare @a varchar(20), @b varchar(20) 
    set @a = '0' 
    set @b = '-' 
    if @a > @b 
    print '0>-' 
    else 
    print '0<-';
    /*
    0>-
    */
    declare @c varchar(20), @d varchar(20) 
    set @c = '170' 
    set @d = '17-' 
    if @c > @d 
    print '170>17-' 
    else 
    print '170<17-';
    /*
    170>17-
    */
    declare @e varchar(20), @f varchar(20) 
    set @e = '1702' 
    set @f = '17-2' 
    if @e > @f 
    print '1702>17-2' 
    else 
    print '1702<17-2';
    /*
    1702<17-2
    */
      

  2.   

    declare @a varchar(20), @b varchar(20) 
    set @a = '172' 
    set @b = '17-2'
    if @a > @b and @a <> @b
    print '172>17-2' 
    else 
    print '172<17-2';
    /*
    172<17-2
    */declare @c varchar(20), @d varchar(20) 
    set @c = '172-' 
    set @d = '17-2'
    if @c > @d and @c <> @d
    print '172->17-2' 
    else 
    print '172-<17-2';
    /*
    172->17-2
    */declare @e varchar(20), @f varchar(20) 
    set @e = '172' + char(1) 
    set @f = '17-2'
    if @e > @f and @e <> @f
    print '172+char(1)>17-2' 
    else 
    print '172+char(1)<17-2';
    /*
    172+char(1)>17-2
    */declare @g varchar(20), @h varchar(20) 
    set @g = '172' + char(0)
    set @h = '17-2'
    if @g > @h and @g <> @h
    print '172+char(0)>17-2' 
    else 
    print '172+char(0)<17-2';
    /*
    172+char(0)<17-2
    */
    SQL server将‘17-2’变成一个仅大于‘172’而小于‘172’+ char(1)的字符串了,我认为这是它的bug。
      

  3.   

    当在比较时的字符串中出现'-'时,比较就不是从左到右依次比较acsii码了原理解释不清楚但是如果你要排序,这样处理一下:
    declare @table table (data varchar(12))
    insert into @table
    select '1702010070' union all
    select '17-2007-0002'select * from @table order by data desc
    /*
    data
    ------------
    17-2007-0002
    1702010070
    */--处理后的
    select * from @table order by replace(data,'-',',') desc
    /*
    data
    ------------
    1702010070
    17-2007-0002
    */