排序规则引起的冲突问题

最近在工作中碰到一例因排序规则而导致的冲突问题,运行环境是SQL 2008,具体代码如下:

DECLARE @URL VARCHAR(500),
	@startdate DATETIME,
	@enddate DATETIME,
	@Identifier VARCHAR(20);	

SELECT @URL = '/articlenet/article.aspx',
       @startdate = '2010-02-01',
       @enddate = '2010-02-28',
       @Identifier = 'id';

SELECT CAST(au.PopulateDate AS date) AS DateViewed
		   ,qs.Value
		   ,COUNT(1) AS PageViews
		   ,COUNT(
		      DISTINCT CASE WHEN au.UserId = 6264375 THEN au.FPID
		                      ELSE du.UserGUID  END
		         ) AS DistinctUsers
FROM Dim_URL u (NOLOCK)
	JOIN dbo.Agg_User_Archive au  (NOLOCK)
		ON u.URLKey  = au.URLKey
	JOIN Dim_QueryString qs  (NOLOCK)
		ON au.AggUserId  = qs.AggUserId
	JOIN dbo.Dim_UserId du (NOLOCK)
		ON du.UserKey  = au.UserId
WHERE URL  = @URL
	AND au.PopulateDate  > @startdate
	AND au.PopulateDate  < @enddate
	AND qs.Identifier  = @Identifier
GROUP BY CAST(au.PopulateDate AS DATE), Value
ORDER BY DateViewed DESC, Value;

--Msg 457, Level 16, State 1, Line 11
--Implicit conversion of varchar value to varchar cannot be performed because the collation of the value is unresolved due to a collation conflict.
 /*该查询是一个已经编写好的查询语句,只是根据需要我们做出了适当的调整。即新增了一个JOIN表Dim_UserId,然后将CASE子句中THEN后 
 面跟的,原来为FPIDKey更换为FPID,ELSE后面的UserId更换为UserGUID。修改后的批处理中语法检查时并没有发现任何错误。执行时出现
 上述错误提示。从错误的提示来分析是因为排序冲突所致,因此查看新增的两个字段是否使用了相同的排序规则。下面是查看语句: */  
SELECT o.name,o.object_id,c.name,c.column_id,c.collation_name
FROM sys.columns c
	JOIN sys.objects o
		ON c.object_id = o.object_id
WHERE o.object_id = OBJECT_ID('dbo.Dim_UserId')
    AND c.name = 'UserGUID'
UNION
SELECT o.name,o.object_id,c.name,c.column_id,c.collation_name
FROM sys.columns c
	JOIN sys.objects o
		ON c.object_id = o.object_id
WHERE o.object_id = OBJECT_ID('dbo.Agg_User_Archive')
    AND c.name = 'FPID'
/*
name               object_id      name     column_id   collation_name
------------------ ----------- ---------- ----------- ----------------------
Agg_User_Archive   1613248802   FPID       28          Latin1_General_CS_AI
Dim_UserId         1234819461  UserGUID    2           Latin1_General_BIN
*/    

--从查询结果中可以看出,原来是因为两个列使用的不同的排序规则,故在count运算时发生了错误。于是修改语句如下,问题解决。下面仅列出被修改过的语句。 
COUNT(DISTINCT CASE WHEN au.UserId = 6264375 THEN au.FPID COLLATE DATABASE_DEFAULT
	            ELSE du.UserGUID  COLLATE DATABASE_DEFAULT END
	  ) AS DistinctUsers

以下列出Collate子句的语法:
COLLATE { <collation_name> | database_default }
<collation_name> :: =      { Windows_collation_name } | { SQL_collation_name }

几点注意事项:
一、排序规则可以在以下几个级别指定:
1.创建或更改数据库。
2.创建或更改表列。
3.投影表达式的排序规则。
二、COLLATE 子句只能应用于 char、varchar、text、nchar、nvarchar 和 ntext 数据类型。

其它关于排序规则问题请参照本人的其它文章:SQL server 排序规则(COLLATE)
更多参考:http://msdn.microsoft.com/zh-cn/library/ms184391.aspx

 

时间: 2024-07-31 19:33:22

排序规则引起的冲突问题的相关文章

SQL Server的排序规则(collation)冲突和解决方案

  什么是排序规则(collation) 关于SQL Server的排序规则,估计大家都不陌生,在创建数据库时我们经常要选择一种排序规则(conllation),一般我们会留意到每一种语言的排序规则都有许多种,比如标准大陆简体中文Chinese_PRC的排序规则就有数十种之多. 这些排序规则有什么作用呢?让我们先来看看MS官方的解释: 排序规则指定了表示每个字符的位模式.它还指定了用于排序和比较字符的规则.排序规则具有下面的特征: 语言 区分大小写 区分重音 区分假名 比如在SQL Server

利用排序规则特点计算汉字笔划和取得拼音首字母

汉字|排序|拼音 SQL SERVER的排序规则平时使用不是很多,也许不少初学者还比较陌生,但有一个错误大家应是经常碰到: SQL SERVER数据库,在跨库多表连接查询时,若两数据库默认字符集不同,系统就会返回这样的错误:                   "无法解决 equal to 操作的排序规则冲突." 一.错误分析: 这个错误是因为排序规则不一致造成的,我们做个测试,比如:create table #t1(name varchar(20) collate Albanian_

整理一下SQLSERVER的排序规则

server|sqlserver|排序     SQL SERVER的排序规则平时使用不是很多,也许不少初学者还比较陌生,但有 一个错误大家应是经常碰到:  SQL  SERVER数据库,在跨库多表连接查询时,若两数据 库默认字符集不同,系统就会返回这样的错误:                        "无法解决  equal  to  操作的排序规则冲突." 一.错误分析: 这个错误是因为排序规则不一致造成的,我们做个测试,比如: create  table  #t1( nam

用排序规则特点计算汉字笔划和取得拼音首字母

汉字|排序|拼音 SQL SERVER的排序规则平时使用不是很多,也许不少初学者还比较陌生,但有     一个错误大家应是经常碰到:   SQL   SERVER数据库,在跨库多表连接查询时,若两数据     库默认字符集不同,系统就会返回这样的错误:                                               "无法解决   equal   to   操作的排序规则冲突."         一.错误分析:     这个错误是因为排序规则不一致造成的,我

select-当子查询里面加上Chinese_PRC_CI_AS的排序规则后,某些数据却查不出来

问题描述 当子查询里面加上Chinese_PRC_CI_AS的排序规则后,某些数据却查不出来 代码如下: SELECT * from dbo.VW_msSyInfo_zy WHERE syh collate Chinese_PRC_CI_AS not in (select Syh from dbo.msSyInfo_zy) and indate >'2015-01-01' 当没加collate Chinese_PRC_CI_AS的时候会报错 无法解决 equal to 运算中 "Chine

MS SQL 排序规则总结

排序规则术语        什么是排序规则呢? 排序规则是根据特定语言和区域设置标准指定对字符串数据进行排序和比较的规则.SQL Server 支持在单个数据库中存储具有不同排序规则的对象.MSDN解释:在 Microsoft SQL Server中,字符串的物理存储由排序规则控制.排序规则指定表示每个字符的位模式以及存储和比较字符所使用的规则 当 Transact-SQL 语句在具有不同排序规则设置的不同数据库上下文中运行时,其运行结果可能会不同.如果可能,请为您的组织使用标准化排序规则.我管

SQL SERVER修改排序规则——脚本篇

在上篇MS SQL 排序规则总结中, 大致就数据库服务器排序规则(或者叫数据库实例排序规则).数据库排序规则.列的排序规则粗浅的叙说了一遍,重点讲述了修改数据库服务器排序规则(数据库 实例排序规则),其中对于数据库排序规则的修改只是粗略带过.其实相对而言,修改服务器排序规则(数据库实例排序规则)相对简单一些,修改数据库的排序规 则就复杂多了,因为涉及到数据.SQL脚本等等,例如,一不小心,修改排序规则后,数据当中可能就会出现乱码: 另外,修改数据库排序规则麻烦的是要大量修改相关表的字段的排序规则

整理一下SQLSERVER的排序规则_MsSql

SQL SERVER的排序规则平时使用不是很多,也许不少初学者还比较陌生,但有 一个错误大家应是经常碰到:  SQL  SERVER数据库,在跨库多表连接查询时,若两数据 库默认字符集不同,系统就会返回这样的错误:                        "无法解决  equal  to  操作的排序规则冲突." 一.错误分析: 这个错误是因为排序规则不一致造成的,我们做个测试,比如: create  table  #t1( name  varchar(20)  collate 

更改排序规则

排序 可使用 ALTER TABLE 语句更改列的排序规则: CREATE TABLE MyTable  (PrimaryKey   int PRIMARY KEY,   CharCol      varchar(10) COLLATE French_CI_AS NOT NULL  )GOALTER TABLE MyTable ALTER COLUMN CharCol            varchar(10)COLLATE Latin1_General_CI_AS NOT NULLGO 不能