首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

* 请邹老大或者帮忙,非常妖怪的有关问题,可能和SQLServer的“排序规则”有关系 *

2012-01-19 
*** 请邹老大或者各位高手帮忙,非常妖怪的问题,可能和SQLServer的“排序规则”有关系 ***我的同一个SQL查询

*** 请邹老大或者各位高手帮忙,非常妖怪的问题,可能和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(影子)

是的
--------------
期待高手出现
[解决办法]
是建表时定义的排序规则造成的


[解决办法]
帮顶 !
[解决办法]
nvarchar [(n)]:
如果没有在数据定义或变量声明语句中指定 n,则默认长度为 1。如果没有使用 CAST 函数指定 n,则默认长度为 30。

如果列数据项的大小可能相同,请使用 nchar。

如果列数据项的大小可能差异很大,请使用 nvarchar。

为使用 nchar 或 nvarchar 的对象分配的是默认的数据库排序规则,但可使用 COLLATE 子句分配特定的排序规则。

SET ANSI_PADDING ON 永远适用于 nchar 和 nvarchar。SET ANSI_PADDING OFF 不适用于 nchar 或 nvarchar 数据类型。

COLLATE :
创建或更改表列:
可以使用 CREATE TABLE 或 ALTER TABLE 语句的 COLLATE 子句指定每个字符串列的排序规则。还可以在使用 SQL Server Management Studio 创建表时指定排序规则。如果不指定排序规则,将为列分配数据库的默认排序规则。

转换表达式的排序规则:
可以使用 COLLATE 子句将字符表达式转换为某个排序规则。为字符文本和变量分配当前数据库的默认排序规则。为列引用分配列的定义排序规则。

COLLATE 子句只能应用于 char、varchar、text、nchar、nvarchar 和 ntext 数据类型。

排序规则标签 对象的类型
强制默认
任何 Transact-SQL 字符串变量、参数、文字、目录内置函数的输出或不使用字符串输入但生成字符串输出的内置函数。

如果在用户定义函数、存储过程或触发器中声明对象,则为该对象分配创建函数、存储过程或触发器所采用的数据库默认排序规则。如果在批处理中声明对象,则为该对象分配用于连接的当前数据库的默认排序规则。

隐式 X
列引用。从为表或视图中的列定义的排序规则得到表达式 (X) 的排序规则。

即使使用 CREATE TABLE 或 CREATE VIEW 语句中的 COLLATE 子句为列显式分配了排序规则,该列引用仍归为隐式。

显式 X
使用表达式中的 COLLATE 子句显式转换为特定排序规则 (X) 的表达式。

无排序规则
指示表达式的值是两个字符串之间的运算结果,而这两个字符串具有隐式排序规则标签的冲突排序规则。表达式的结果被定义为不具有排序规则。


排序规则
只引用一个字符串对象的简单表达式的排序规则标签是被引用对象的排序规则标签。

如果复杂表达式被引用两个操作数表达式的排序规则标签相同,则该复杂表达式的排序规则标签为操作数表达式的排序规则标签。

如果复杂表达式被引用两个操作数表达式的排序规则不同,则该复杂表达式最终结果的排序规则标签基于下列规则:

显式优先于隐式。隐式优先于强制默认:

----------------------------------------
建议建表时指定 隐式 X

[解决办法]
这样,在不同默认规则环境中出错的概率就低了

热点排行
Bad Request.