|
里面使用的数据库会有简体中文和繁体中文两种版本。我现在这个专案使用的SQLS是繁体中文版的,但是需要使用到另一个使用简体中文版SQLS专案的数据,我按照通常的做法把简体中文版SQLS中的一个数据表导入到现在使用的繁体中文版SQLS中,结构和数据都导入成功了。我一开始并没有意识到这样做会有什么问题。接下来我开始调试SQL语句,其是一个很简单的两表关联数据选择大致如下:
1*,2*
1
22FK=1PK
照理说这么简单的语句没道理会出什么问题,不过在查询分析器里面始终提示如下的错误
服务器:消息446,级别16,状态9,行1
無法解析動作的定序衝突。
后来搜索了一下,然后又看了一下T-SQL的帮助,才知道原来是因为我将简体中文SQLS中的数据表导入到繁体中文的数据表中的是后,连同原数据的排序方式一并导入,导致了简体数据表的排序方式依然是简体,所以法进行比较,从而出错。解决的办法是指排序方式,告诉查询分析器应该怎样排序即可。这里会需要用到一个关键字COLLATEC在SQLS联机丛书中是这样解释的:
COLLATE
一个子句,可应用于数据库定义或列定义以定义排序规则,或应用于字符串表达式以应用排序规则投影。
语法:
COLLATE_
_::=
{W__}|{SQL__}
参数
_
是应用于表达式、列定义或数据库定义的排序规则的称。_可以只是指定的W__或SQL__。
W__
是W排序规则的排序规则称。请参见W排序规则称。
SQL__
是SQL排序规则的排序规则称。请参见SQL排序规则称。
那么我们怎么可以知道当前的排序规则称是什么呢,其这个排序规则称是我们在创建数据库(例)的时候就可以进行选择的,不过通常情况下我们都会默认原来的设定,不会对其进行变更,所以如果是简体中文的SQLS就会默认的使用简体中文的排序规则,而如果是繁体中文的SQLS就会默认的使用繁体中文的排序规则。我们在察看数据库(例)的属性时,常规页签的比较下面一行就是当前的排序规则。在默认的情况下,简体中文的排序规则称是:C_PRC_CI_AS,而繁体中文的排序规则称则是:C_T_S_CI_AS,所以我们如果在有简体繁体排序规则称混用的时候,只要声明一下你当前要使用哪种排序规则进行比较就可以了,例如针对上面的那个SQL语句,下面两种方法都可以解决那个错误提示的问题
SELECTT1*,T2*
FROMT1
INNERJOINT2ONT2FK=T1PKCOLLATEC_PRC_CI_AS
SELECTT1*,T2*
FROMT1
INNERJOINT2ONT2FK=T1PKCOLLATEC_T_S_CI_AS
说了半天如何解决排序规则冲突引起的问题,如果还有兴趣的话,下面把SQLS联机丛书里面关于排序规则的概念贴出来给大家分享一下,省得大家再去找:
MSQLS2000支持多种排序规则。排序规则对控制正确使用语言(如马其顿语或波兰语)或字母表(如西欧语言使用的拉丁字母表L1_G)字符的规则进行编码。
每个SQLS排序规则指定个属性:
用于U数据类型(、和)的排序次序。排序次序定义字符的排序序列,以及在比较操作中对字符取值的方法。
用于非U字符数据类型(、和)的排序次序。
用于存储非U字符数据的代码页。
说明不能指定与U数据类型(、和)对应的代码页。用于U字符的双字节位模式由U标准定义且不能更改。
可在任何级别上指定SQLS2000排序规则。安装SQLS2000例时,可指定该例的默认排序规则。每次创建数据库时,可指定用于该数据库的默认排序规则。如果未指定排序规则,数据库的默认排序规则即是例的默认排序规则。论何时定义字符列、变量或参数,都可指定这些对象的排序规则。如果未指定排序规则,将使用数据库的默认排序规则创建这些对象。
如果SQLS例的所有用户都使用同一种语言,则应选择支持该语言的排序规则。例如,若所有用户都讲法语,则选择法语排序规则。
如果SQLS例的用户使用多种语言,则应选择能对多语种需求提供比较佳支持的排序规则。例如,如果用户一般都讲西欧语言,则选择L1_G排序规则。当支持使用多种语言的用户时,对所有字符数据都使用U数据类型、和比较为重要。U旨在消除非U、和数据类型的代码页转换困难。因为排序规则定义用于比较操作的排序次序和U字符的排序,所以当用U数据类型现所有的列时,排序规则仍会产生不同。即使当使用U数据类型存储字符数据时,也应选择支持大多数用户的排序规则,以防使用非U数据类型现列或变量。
SQLS排序规则定义数据库引擎存储和操作字符及U数据的方式。然而,当数据移入应用程序后,在应用程序中进行的字符排序和比较将由计算机上选定的W区域设置控制。应用程序使用的字符数据排序规则是由W区域设置控制的项目之一,区域设置还定义其它项目,如数字、时间、日期和货币格式。对于MWNT40、MW98和MW95,可使用控制面板中的"区域设置"应用程序指定W区域设置。对于MW2000,可使用"控制面板"中的"区域选项"应用程序指定区域设置。有关W区域设置的更多信息,请参见MW站点MSDN页中的DISW95WNT40。
多个排序规则可对非U数据使用相同的代码页。例如,代码页1251定义西里尔语字符集。多个排序规则(如C_G、U和M)都使用该代码页。虽然这些排序规则都使用相同的位集来表示非U字符数据,但在处理字典定义时所应用的排序和比较规则略有不同,而字典定义确定语言或字母表中与排序规则相关的正确字符序列。
因为SQLS2000排序规则控制U和非U排序次序,所以不会遇到由为U和非U数据指定不同的排序规则而引起的问题。在SQLS的早期版本中,对代码页号、字符排序次序和U排序规则分别进行指定。SQLS的早期版本还支持每个代码页有不同数目的排序次序,并为某些代码页提供W区域设置中没有的排序次序。在SQLS70中,还可以指定为非U数据选择的排序次序以外的其它U排序次序。这会导致在使用与非U数据相对的U数据时,排序和比较操作返回不同的结果。 |
|