sql server排序规则冲突问题解决

摘要:
中英文错误提示信息如下。中文:无法解决相等操作中“SQL_Latin1_General_CP1_CI_AS”和“Chinese_PRC_CI_AS“之间的排序规则冲突。中文:无法解决“SQL_Latin1_General_CP1_CI_AS”和“Chinese_PRC_CI_AS“在同等操作中的结构冲突。根本原因:根据博主在实际工作中遇到的问题,这个问题可以总结为:如果本地计算机是中文操作系统,服务器是英文操作系统,并且脚本使用临时表,并且没有指定nvarchar或varchar文本字段的排序规则,如果此文本字段用于连接表连接中与项目数据库关联的表的关联条件,则会出现此问题。不建议使用此方法,因为如果有10个联接临时表语句,则必须将它们写入10次,这太麻烦了。

问题:
在项目数据库开发中,有时我们编写的脚本,在本机执行是没有问题的,但部署到服务器的时候,却在脚本运行时报错了。报错的中英文错误提示信息分别如下。
中文:无法解决 equal to 运算中 "SQL_Latin1_General_CP1_CI_AS" 和 "Chinese_PRC_CI_AS" 之间的排序规则冲突。
English:Cannot resolve the collation conflict between "SQL_Latin1_General_CP1_CI_AS" and "Chinese_PRC_CI_AS" in the equal to operation.

根源:
根据博主(微信公众号:SQL数据库编程,微信号:zhang502219048)实际工作中遇到的问题,概括为:如果本机是中文操作系统,而服务器是英文操作系统,而且脚本使用了临时表并且没有指定nvarchar或varchar文本字段的排序规则,并在join表连接中关联项目数据库的表(项目数据库默认排序规则为Chinese_PRC_CI_AS)的on关联条件中用到此文本字段,则会出现此问题。

解决方案:
方案1(不推荐)
在join连接的on条件字段中,对临时表指定排序规则。这种方法不推荐,因为如果有10个join临时表的语句,就得写10次,太过于繁琐。

select *
from #t1 a
inner join t2 b 
    on b.name = a.name collate Chinese_PRC_CI_AS

方案2推荐
在临时表的nvarchar或varchar文本字段定义中,增加指定排序规则,一劳永逸,不需要再在join连接的on条件中指定排序规则。

create table #t1
(
    name nvarchar(50) collate Chinese_PRC_CI_AS
)

【转载请注明博文来源:https://www.cnblogs.com/zhang502219048/p/12992611.html】

免责声明:文章转载自《sql server排序规则冲突问题解决》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇修改加粗cmd和powershell命令行的中文字体【ogg三】日常运维篇:清理归档日志,ogg进程注册服务,定期备份数据库下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

sqlserver 表循环-游标、表变量、临时表

SQL Server遍历表的几种方法 阅读目录 使用游标 使用表变量 使用临时表 在数据库开发过程中,我们经常会碰到要遍历数据表的情形,一提到遍历表,我们第一印象可能就想到使用游标,使用游标虽然直观易懂,但是它不符合面向集合操作的原则,而且性能也比面向集合低。当然,从面向集合操作的角度出发,也有两种方法可以进行遍历表的操作,总结起来,遍历表有下面...

EXEC的两种用法以及用动态语句创建临时表的问题

exec有两种用法,一种是调用存储过程,另一种是执行sql语句,用法如下: exec dbo.GetCustomer 'Create table #Temp' exec ('Create table #Temp') 用动态语句创建临时表有一个问题,就是如果你不在它的作用域内就找不到。解决方法是把要调用临时表的语句都放在exec内,如: exec ('Cre...

SqlServer 统计1-12月份 每个月的数据(临时表)

想做一个年度图表 效果如下,通过sqlserver来统计今年1-12月份每个月的数据,效果如下 sql语句网上找了很多都没有找到满意的 找到的其中一种写法是这样子的 这种写法对于前端来说很方便 不用进行数据处理, 但缺点在于 1:后端是不是得定12个属性的容器来接收这个数据格式 2:假如我要一个在一个查询结果中显示两个不同对象的年度统计数据就无法实现,...

ORACLE WITH AS 用法

With查询语句不是以select开始的,而是以“WITH”关键字开头    可认为在真正进行查询之前预先构造了一个临时表,之后便可多次使用它做进一步的分析和处理 WITH Clause方法的优点     增加了SQL的易读性,如果构造了多个子查询,结构会更清晰;更重要的是:“一次分析,多次使用”,这也是为什么会提供性能的地方,达到了“少读”的目标。   ...

MySQL性能调优思路

1.MySQL性能调优思路 如果一台服务器出现长时间负载过高 /周期性负载过大,或偶尔卡住如何来处理? 是周期性的变化还是偶尔问题?是服务器整体性能的问题, 还是某单条语句的问题? 具体到单条语句, 这条语句是在等待上花的时间,还是查询上花的时间? 1.1. 监测并观察服务器的状态. 观察服务器状态, 一般用如下2个命令 Show status;...

SQL SERVER 实现多个数据库之间表的联系,利用临时表枚举表中行数据

--SET IDENTITY_INSERT [User] on; SELECT ROW_NUMBER() OVER ( ORDER BY EmpID ) i,* INTO #A FROM [GMSToolManage].dbo.[employees]; DECLARE @count INT; SELECT @count=COUNT(1) FROM#A;...