日期:2014-05-19  浏览次数:20608 次

*** 请邹老大或者各位高手帮忙,非常妖怪的问题,可能和SQLServer的“排序规则”有关系 ***
我的同一个SQL查询语句,执行几次每次返回的结果行数都不一样。
请注意,相关的两个表的数据绝对不会改变,因为我是备份出来的。
下面是我的SQL:

SELECT   tblMO.COMNO,   tblCO.IsClose,   tblMO.*  
FROM   tblMOBak   AS   tblMO,   tblCOBak   AS   tblCO
WHERE   tblMO.OrderNO   =   tblCO.CONo  
AND   IsNull(tblCO.IsClose,   '0 ')   =   '0 '

非常简单的SQL吧,奇怪,但同样的SQL在我的开发机器上就不会有
这个问题。出问题的是我的服务器(Win2000+SQL2000服务器版本)
我本机是(XP+SQLServer2000开发版),两机器数据库的排序规则
都是一样的Chinese_PRC_CI_AS,字段的排序规则是default

我查了很长,发现我把SQL改成这样就没有问题了。

SELECT   tblMO.COMNO,   tblCO.IsClose,   tblMO.*  
FROM   tblMOBak   AS   tblMO,   tblCOBak   AS   tblCO
WHERE   tblMO.OrderNO   =   tblCO.CONo  
AND   IsNull(tblCO.IsClose   COLLATE   Chinese_PRC_CI_AI,   '0 ')   =   '0 '

这样就好了,请问这是怎么回事???
(其中,IsClose是个char(1)字段)

这个问题非常严重,造成我们的系统里面很多SQL语句都有可能出现
类似的莫名其妙的问题,我们又不可能逐一去改,工作量也太大了?

请问是怎么回事,怎么处理??



------解决方案--------------------
SELECT tblMO.COMNO, tblCO.IsClose, tblMO.*
FROM tblMOBak AS tblMO, tblCOBak AS tblCO
WHERE tblMO.OrderNO = tblCO.CONo
AND tblCO.IsClose is null
------解决方案--------------------
Chinese_PRC_CI_AS --表示區分重音
Chinese_PRC_CI_AI --表示不區分重音
------解决方案--------------------
呵呵。。
SELECT tblMO.COMNO, tblCO.IsClose, tblMO.*
FROM tblMOBak AS tblMO, tblCOBak AS tblCO
WHERE tblMO.OrderNO = tblCO.CONo
AND (tblCO.IsClose IS NULL OR tblCO.IsClose= '0 ')

这个正确不?
------解决方案--------------------
是排序规则的问题
alter table tblCOBak
alter column IsClose [char](1) COLLATE Chinese_PRC_CI_AS
------解决方案--------------------
问题不在怎么写

而在于默认COLLATE,为什么IsNull(tblCO.IsClose, '0 ') = '0 '
有问题。。。

waiting高手解答
------解决方案--------------------
写错了,应该是这样
alter table tblCOBak
alter column IsClose [char](1) COLLATE Chinese_PRC_CI_AI
------解决方案--------------------
有没可能跟tblMO.OrderNO = tblCO.CONo 有关系?
把COLLATE Chinese_PRC_CI_AI 换个地方看看。。。
------解决方案--------------------
估计 IsClose 的排序规则不是 Chinese_PRC_CI_AI,而你现在运行SQL 语句的服务器默认的排序规则是 Chinese_PRC_CI_AI, 查询的时候就会出现以上的情况.
------解决方案--------------------
我就在服务器上运行也是同样的问题,数据库的缺省排序规则是“Chinese_PRC_CI_AS”,
为什么要改变成 "Chinese_PRC_CI_AI "呢,不改就会出莫名其妙的东西?我的机器也是
一样的排序规则,为什么不改就可?
----------------------------------
打开 IsClose 结构脚本看看 排序规则是否都是
Chinese_PRC_CI_AS
------解决方案--------------------
2k里面排序规则有好几个级别的!服务器级别的、数据库级别的、表级别的,也许你创建的表在 create或者alter的时候是从其它数据库DTS或者直接通过编辑脚本(自动生成的创建脚本一般参数非常详细,每个字段的collate都包含),你看看这张tblCOBak表是否字段排序有问题!
简单点,在查询分析器里打开对象浏览器,选中你操作的这张表,选择右键菜单在新窗口中编写对象脚本-〉创建,打开的脚本你看看这个字段的排序规则怎么样的
------解决方案--------------------
hlq8210(影子)

是的
--------------
期待高手出现
------解决方案--------------------
是建表时定义的排序规则造成的