在最近的工作中使用SQL数据库的时候出现以下错误。具体情况是这样的:
在插入数据前,创建了一个临时表#Tmp_Table。然后使用临时表里面的列表项与已有表的列表项进行join的对比。以下是比较具体的代码:
Create Table #Tmp_Special_List([ID][nvarchar](400) NULL, [Name][nvarchar](50) NULL, [Reason][ntext]NULL, [Remark][ntext]NULL);
Select 已有表的列表项.ID From (已有表 inner join #Tmp_Table on 已有表的列表项.ID=#Tmp_Table.ID)
以上会出现以下的错误
訊息 468,層級 16,狀態 9,行 1
無法解析 equal to 作業中 "Latin1_General_CI_AI" 與 "Chinese_Taiwan_Stroke_CI_AS" 之間的定序衝突。
上网找了找原因。原来SQL有以下特性:
一般繁体中文版 MSSQL 建置时多数人会用预设定序 Chinese_Taiwan_Stroke_CI_AS。但是其中一个资料库是从别的环境附加进来的,该资料库定序是用 Chinese_Taiwan_Stroke_BIN (或其他定序)。一般来说,在同一个资料库中的资料表的定序都会使用资料库预设值。此问题常发生于处理两个资料库的资料表进行JOIN关联之时而建立临时表#tbMain会使用TempDB资料库的空间与定序而TempDB资料库的定序使用服务器的定序设定所以当JOIN这两个不同定序的资料表时,字串栏位就无法进行比对而回应错误。解决方法要使用强制转换。可以在创建临时表的时候强制指定定序
Create Table #Tmp_Special_List([ID][nvarchar](400) COLLATE Chinese_Taiwan_Stroke_BIN NULL, [Name][nvarchar](50) COLLATE Chinese_Taiwan_Stroke_BIN NULL, [Reason][ntext] COLLATE Chinese_Taiwan_Stroke_BIN NULL, [Remark][ntext] COLLATE Chinese_Taiwan_Stroke_BIN NULL);
原文是以下网址:
http://blog.bestlong.idv.tw/2009/10/11/703