有中英文系统,中文系统下安装的是Sql Server2000的排序规则选择Chinese_PRC_BIN,
英文系统下安装的Sql Server2000的排序规则选择为Latin1_General_BIN,
现有1个数据库A,创建时未指定排序规则,其中有1个数据表B,其中的varchar字段创建时也未指定排序规则。
这个表B建立了视图C,其中,对Varchar字段使用了replace函数。
用bcp.exe导出数据时,在中文系统下没有问题,但是在英文系统下会报排序规则冲突。
请问会是什么原因?1)视图如下:
CREATE VIEW vw_TZ_ForTest 
AS 
SELECT  A.ulReserved      AS 'TimeZone', B.UseXXX      AS 'DaylightSave', 
CAST(replace(B.StartTime,':','&') AS CHAR(8))  AS 'StartTime', 
CAST(replace(B.EndTime,':','&') AS CHAR(8))      AS 'EndTime', 
FROM GLOBELRESERVEDSTABLE A ,T_DaylightSavingTime B    
WHERE A.ulClassIndex = 1000 AND  A.ulObjectIndex =1000 AND A.ulFieldName = 1000 AND A.ulFieldValue = 1000 AND 1=1 2)导出如下:
C:\Program Files\Microsoft SQL Server\80\Tools\Binn\bcp.exe "SELECT * FROM vw_TZ_forTEST" queryout "D:\TZ.txt" -c -U  sa -P -T -q -e "D:\vw_TZ_forTEST.log" 3)错误如下(英文系统中)
SQLState = 37000, NativeError = 446 
Error = [Microsoft][ODBC SQL Server Driver][SQL Server]Cannot resolve collation conflict for replace operation. 
SQLState = 37000, NativeError = 8180 
Error = [Microsoft][ODBC SQL Server Driver][SQL Server]Statement(s) could not be prepared. 

解决方案 »

  1.   

     NCHAR(8)--加NcharBCP加上-N 命令
      

  2.   

    有中英文系统,中文系统下安装的是Sql Server2000的排序规则选择Chinese_PRC_BIN,
    英文系统下安装的Sql Server2000的排序规则选择为Latin1_General_BIN,
    现有1个数据库A,创建时未指定排序规则,其中有1个数据表B,其中的varchar字段创建时也未指定排序规则。
    这个表B建立了视图C,其中,对Varchar字段使用了replace函数。
    用bcp.exe导出数据时,在中文系统下没有问题,但是在英文系统下会报排序规则冲突。
    请问会是什么原因?沒指定時,字段排序為數據庫的默認排序規則排序對條件會有影響。。可通過指定排序規序來處理 collate 排序規則
      

  3.   

    现在查下来,发现问题是这样的。
    因为是用安装盘安装的数据库A,而所谓安装其实是在编译服务器上生成数据库,然后备份数据库,
    在目的服务器上恢复。因为编译机器是中文的,其Sql Server的实例是Chinese_PRC_BIN,数据库A的排序规则没有指定,
    所以是默认,也是Chinese_PRC_BIN。现在在英文系统上“安装(其实是恢复)”数据库A,这样,数据库A的排序规则还是Chinese_PRC_BIN,
    数据表B的varchar字段C的排序规则也是数据库A的默认排序规则(即Chinese_PRC_BIN)
    而因为英文系统的实例是Latin1_General_BIN,所以在使用内部函数Replace(字段C, ':', '&')时发生规则冲突.这里想确认一下:
    1)在英文系统上修改字段C的排序规则为Latin1_General_BIN,则问题解决了。
       那是否说明Replace内部函数是根据master数据库的排序规则来的(master数据库的排序规则是Latin1_General_BIN)
    2)Replace(字段C, ':', '&'),如果不修改字段C的排序规则,还有没有其他的解决方法?
    谢谢
      

  4.   

    1)在英文系统上修改字段C的排序规则为Latin1_General_BIN,则问题解决了。 
      那是否说明Replace内部函数是根据master数据库的排序规则来的(master数据库的排序规则是Latin1_General_BIN) --不是,是根据你当前数据库建立的时候指定的排序规则,但是,通常情况下,如果用户在创建数据库是没有指定对应的规则的话,
    --那么默认使用的就是master数据库的排序规则.
    2)Replace(字段C, ':', '&'),如果不修改字段C的排序规则,还有没有其他的解决方法? -- 在字段上加入 ColumnName collate Latin1_General_BIN 试试,
    -- 具体例子在你另外一个帖子里面
      

  5.   

      [StartTime]            [VARCHAR](100)  COLLATE Latin1_General_BIN  NOT NULL, 
      [EndTime]              [VARCHAR](100) COLLATE Latin1_General_BIN NOT NULL, 试试
      

  6.   


    1
    不是
    2
    不改变列的排序规则(表结构中),但在操作时指定排序规则
    比如:
    select * from tb where name collate Latin1_General_BIN ='aa'
      

  7.   

    楼主的视图和表在同一个db下面吗?你的 bcp 导出的时候, 查询没有指定库名, 你登录的用户设置的默认数据库是什么?
      

  8.   

    楼主的视图和表在同一个db下面吗? 
    >>在同一db下面你的 bcp 导出的时候, 查询没有指定库名, 你登录的用户设置的默认数据库是什么?
    >>查询没有指定库名是我贴漏了。贴上来的时候将其他无关的都删除了,可能删多了。
      使用的用户名设置的默认数据库是master。
      不过我即使修改了指定的数据库,还是一样的错误。
      现在最大的问题是REPLACE(A字段,':','&')报排序规则错误。
      此处如果显示指定一个排序规则,譬如REPLACE(A字段,':','&' COLLATE Chinese_PRC_BIN)
                                或者REPLACE(A字段,':','&' COLLATE Latin1_General_BIN)
      结果都是好的。  此外,如果不用view,单单将创建视图的Sql语句导出,譬如:
      C:\...\bcp.exe "Select replace(A字段,':','&') as 'starttime' ...." queryout ....
      则是没有问题的。
      这个也很奇怪。
      

  9.   

    在数据库里,用到的字符串常量难道不是当前数据库的排序规则,而是master数据库的排序规则吗?
    譬如:Select ... From db1.table1 where field1='aaa'
    我看帮助里有些例子是指定排序规则的:
    Select ... From db1.table1 where field1='aaa' collate Latin1_General_BIN