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

SQL2008排序规则异常

2013-07-08 
SQL2008排序规则错误我在管理器里面看了,数据库默认排序是Chinese_Taiwan_Stroke_CI_AS,所有表的默认排序

SQL2008排序规则错误
我在管理器里面看了,数据库默认排序是Chinese_Taiwan_Stroke_CI_AS,所有表的默认排序也是Chinese_Taiwan_Stroke_CI_AS

表结构(在过程里面自动创建):


exec ('CREATE TABLE [dbo].['+@tb_name+'] (
[SerialNo] [numeric](18, 0) IDENTITY (1, 1) not NULL ,
[ModelName] [varchar] (30) COLLATE Chinese_PRC_CI_AS NULL ,
[BarcodeNo] [varchar] (30) COLLATE Chinese_PRC_CI_AS not NULL ,
[Station] [varchar] (5) COLLATE Chinese_PRC_CI_AS not NULL ,
[Information] [varchar] (4096) COLLATE Chinese_PRC_CI_AS not NULL ,
[Upload_Date] [datetime]  default getdate() not NULL 
) ON [PRIMARY]')


刚开始在SQL2000上运行的时候没有问题(没加COLLATE Chinese_PRC_CI_AS),现在换到SQL2008上就一直提示这个问题了。我是要按Upload_date desc排序的。
SQL2000:

select * from Y2013_2 where 1=1  and BarcodeNo='CC16711214' and Station='1528' and Upload_Date >='2010-01-12' and Upload_Date <='2013-07-03' union select * from Y2013_1 where 1=1  and BarcodeNo='CC16711214' and Station='1528' and Upload_Date >='2010-01-12' and Upload_Date <='2013-07-03' order by upload_date desc 


SQL2008:

select * from Y2013_2 where 1=1  and BarcodeNo='1234' COLLATE Chinese_PRC_CI_AS union select * from Y2013_1 where 1=1  and BarcodeNo='1234' COLLATE Chinese_PRC_CI_AS union select * from Y2012_2 where 1=1  and BarcodeNo='1234' COLLATE Chinese_PRC_CI_AS union select * from Y2012_1 where 1=1  and BarcodeNo='1234' COLLATE Chinese_PRC_CI_AS union select * from Y2011_2 where 1=1  and BarcodeNo='1234' COLLATE Chinese_PRC_CI_AS union select * from Y2011_1 where 1=1  and BarcodeNo='1234' COLLATE Chinese_PRC_CI_AS union select * from Y2010_2 where 1=1  and BarcodeNo='1234' COLLATE Chinese_PRC_CI_AS union select * from Y2010_1 where 1=1  and BarcodeNo='1234' COLLATE Chinese_PRC_CI_AS union select * from Y2009_2 where 1=1  and BarcodeNo='1234' COLLATE Chinese_PRC_CI_AS union select * from Y2009_1 where 1=1  and BarcodeNo='1234' COLLATE Chinese_PRC_CI_AS union select * from Y2008_2 where 1=1  and BarcodeNo='1234' COLLATE Chinese_PRC_CI_AS union select * from Y2008_1 where 1=1  and BarcodeNo='1234' COLLATE Chinese_PRC_CI_AS union select * from Y2007_2 where 1=1  and BarcodeNo='1234' COLLATE Chinese_PRC_CI_AS union select * from Y2007_1 where 1=1  and BarcodeNo='1234' COLLATE Chinese_PRC_CI_AS



Msg 468, Level 16, State 9, Line 1
无法解决 UNION 运算中 "Chinese_Taiwan_Stroke_CI_AS" 和 "Chinese_PRC_CI_AS" 之间的排序规则冲突。

[解决办法]
需要使用COLLATE 子句指定数据库的默认排序规则保持两边一致。
下面是个例子:
Insert into Security.Report (Name)
              Select C.Path From SSRS.Catalog C 
        Where C.Path Collate Database_Default Like @ReportPath + '/%' 
              And C.Path Collate Database_Default Not In (Select Name From Security.Report R)

[解决办法]

USE master;
GO
ALTER DATABASE DBName
COLLATE Chinese_PRC_CI_AS;
GO

可以修改数据库排序规则

参考:http://msdn.microsoft.com/zh-cn/library/ms175835.aspx

热点排行