近日,在项目Debug过程中发现了SQL Server排序规则冲突的问题。

由于原数据库是从英文环境的SQL中生成的,其排序规则为“SQL_Latin1_General_CP1_CI_AS”,备份到本地中文环境之后,默认的排序规则为“Chinese_PRC_CI_AS”。本来对应的查询语句一直处于稳定的状态。但由于新增了字段,本地环境新增字段排序规则为“Chinese_PRC_CI_AS”,这时与原有的字段进行联查时会出现错误:

无法解决 equal to 运算中 "SQL_Latin1_General_CP1_CI_AS" 和 "Chinese_PRC_CI_AS" 之间的排序规则冲突。

为解决排序规则冲突,可直接修改对应字段的排序规则,使其一致则可避免查询出错。

ALTER TABLE [表名] ALTER COLUMN [字段名] nvarchar(256) COLLATE Chinese_PRC_CI_AS'

但是数据库中还有很多排序为“SQL_Latin1_General_CP1_CI_AS”的字段,如果逐个去改,几个十几个字段的话还可以考虑,要是几十上百个工作量可想而知。

我们可以先查询当前数据库的需要修改的字段,查询对应的表名、字段名、排序规则、字段类型、以及对应的长度等等。

SELECT
t.name AS [Table],
c.name AS [Column],
c.collation_name AS [Collation],
TYPE_NAME( c.system_type_id) AS [TypeName],
c.max_length AS [TypeLength]
FROM sys.columns c
RIGHT JOIN sys.tables t ON c.object_id = t.object_id
WHERE c.collation_name IS NOT NULL

数据库查询的结果为437行...

所以,过多的修改量基本上是不可能手动去慢慢修改的,需要通过SQL查询结果统一修改。

我是将结果集插入到临时表中,在通过循环临时表,exec执行拼接SQL语句去修改每一个记录,具体代码如下:

DECLARE @table NVARCHAR(128)--循环Item表名
DECLARE @column NVARCHAR(128)--循环Item字段名
DECLARE @type NVARCHAR(128)--对应字段的类型,char、nchar、varchar、nvarchar等
DECLARE @typeLenght NVARCHAR(128)--对应类型的长度,nchar、nvarchar需要将数值除于2
DECLARE @sql NVARCHAR(MAX )--要拼接执行的sql语句 SET ROWCOUNT 0 SELECT NULL mykey,
c.name,
t.name AS [Table],
c.name AS [Column],
c.collation_name AS [Collation],
Type_name(c.system_type_id) AS [TypeName],
c.max_length AS [TypeLength]
INTO #temp
FROM sys.columns c
RIGHT JOIN sys.tables t
ON c.object_id = t.object_id
WHERE c.collation_name IS NOT NULL
--先测试Product表
--AND t.name='Product' SET ROWCOUNT 1
UPDATE #temp SET mykey = 1 WHILE @@ROWCOUNT > 0
BEGIN
SET ROWCOUNT 0 --每次查询第一条记录并赋值到对应变量中
SELECT @table = [Table],
@column = [Column],
@type = TypeName,
@typeLenght = TypeLength
FROM #temp
WHERE mykey = 1 --nchar、nvarchar需要将数值除于2
IF CONVERT(INT, @typeLenght) > 0 AND ( @type = 'nvarchar' OR @type = 'nchar' )
BEGIN
SET @typeLenght=CONVERT(NVARCHAR(128), CONVERT(INT, @typeLenght) / 2)
END IF @typeLenght = '-1'
BEGIN
SET @typeLenght='max'
END --拼接sql,注意表名、字段名要带[],避免Group等关键字
SET @sql=' ALTER TABLE [' + @table + '] ALTER COLUMN ['
+ @column + '] ' + @type + '(' + @typeLenght
+ ') COLLATE Chinese_PRC_CI_AS' --Try执行
BEGIN TRY
EXEC(@sql)
END TRY
--Catch查询异常结果
BEGIN CATCH
SELECT @sql AS [ASL],
Error_message() AS msg
END CATCH DELETE #temp
WHERE mykey = 1 SET ROWCOUNT 1 UPDATE #temp
SET mykey = 1
END SET ROWCOUNT 0 DROP TABLE #temp

执行SQL,更新出错的try catch查询结果如下:

我们可看到只有寥寥的几个字段需要通过手动去修改,这些修改不成功的大部分是由于外键关联等原因,逐个排查即可。

至此,SQL已自动修改了大部分字段,大大的减少了工作量。

  

全库修改SQL Server现有排序规则的更多相关文章

  1. 修改SQL Server 的排序规则(转)

    转自http://jimshu.blog.51cto.com/3171847/1095780/ 一.修改SQL Server服务器(实例)的排序规则 以下实验使用了SQL Server 2008 R2 ...

  2. SQL SERVER 的排序规则

    有时候查询数据库的时候会发现(比如做重名检查的时候):数据库的查询时对大小写不敏感的,也就是 A 和 a 是一样的. 也就是说 select * from tabletest where name = ...

  3. SQL Server更改排序规则的实现过程

    摘自: http://www.2cto.com/database/201112/115138.html 以下的文章主要向大家描述的是SQL Server更改排序规则的实现过程,以及在实现其实际操作过程 ...

  4. [转]SQL SERVER 的排序规则

    如何更改SQL SERVER 2000的排序规则 -- 增加复合主键语句 Alter Table tableName Add primary key (field1,field2) Alter dat ...

  5. sql server不同排序规则的数据库间字段的比较

    不同的排序规则的字段是不能直接比较的.会提示:无法解决 equal to 操作的排序规则冲突.可以把字段强制转换一个排序规则,这样就能比较了.示例: ------------------------- ...

  6. SQL SERVER 强制排序规则查询

    有时会需要在2个DB之间的数据做比较, 但因为一些原因, 数据库的默认排序规则是不一样的, 例如 SELECT A.Col1, B.Col1, A.* FROM DB1.dbo.A LEFT JOIN ...

  7. 修改SQL Service数据库排序规则

    修改数据库 alter   database   KidsPang   COLLATE   Chinese_PRC_CI_AS 修改表中字段ALTER TABLE [Member] ALTER COL ...

  8. 利用脚本修改SQL SERVER排序规则

    利用脚本修改SQL SERVER排序规则 编写人:CC阿爸 2014-3-1 l  今年的一项重要工作是对公司所用系统进行繁简的转换,程序转成简体基本很容易解决,但数据库转换成简体,就没那么容易了.经 ...

  9. 修改sql server实例、数据库、表、字段的排序规则

    转自:http://blog.51cto.com/jimshu/1095780 概念与详情请参考:字符编码与排序规则:https://www.cnblogs.com/gered/p/9145123.h ...

随机推荐

  1. MongoDB自动递增序列

    MongoDB没有像SQL数据库外开箱即用自动递增功能.默认情况下,它采用了12字节的ObjectId为_id字段作为主键来唯一地标识文档.然而,可能存在的情况,我们可能希望_id字段有一些其它的自动 ...

  2. HTTP/1.1 持久连接 persistent connection

    首先:HTTP的长连接和短连接本质上是TCP长连接和短连接. 1. 在HTTP1.0中,默认的是短连接,没有正式规定 Connection:Keep-alive 操作:在HTTP1.1中所有连接都是K ...

  3. Mysql的Root密码忘记,查看或修改的解决方法

    Mysql的Root密码忘记,查看或修改的解决方法:1.首先启动命令行2.在命令行运行:taskkill /f /im mysqld-nt.exe3.继续在命令行运行:mysqld-nt --skip ...

  4. Asp.net Mvc 表单验证(气泡提示)

    将ASP.NET MVC或ASP.NET Core MVC的表单验证改成气泡提示: //新建一个js文件(如:jquery.validate.Bubble.js),在所有要验证的页面引用 (funct ...

  5. 推荐一个markdown格式转html格式的开源JavaScript库

    这个markdown格式转html格式的开源JavaScript库在github上的地址: https://github.com/millerblack/markdown-js 从markdown 格 ...

  6. SAP C/4HANA到底包含哪些产品?

    2018年6月的SAPPHIRE(蓝宝石大会)上, SAP发布了新的商务软件套件:C/4HANA,意在通过SAP C/4HANA将前台应用和SAP Digital Core(数字化核心)S/4HANA ...

  7. (五)VMware Harbor 部署之SSL

    转自:https://www.cnblogs.com/Rcsec/p/8479728.html 1 .签名证书与自签名证书 签名证书:由权威颁发机构颁发给服务器或者个人用于证明自己身份的东西. 自签名 ...

  8. python_112_网络编程 Socket编程

    实例1:客户端发小写英文,服务器端返回给客户端大写英文(仅支持一次接受发送) 服务器端: #服务器端(先于客户端运行) import socket server=socket.socket() ser ...

  9. Webpack的使用指南-Webpack小结

    参考文章: https://baijiahao.baidu.com/s?id=1594972657801970108&wfr=spider&for=pc 使用Webpack有一段时间了 ...

  10. Python基础篇 -- if while 语句

    2.7 if语句 # 单纯if if 条件: 代码块 当条件成立,执行代码块 # 二选一 if 条件: 代码块1 else: 代码块2 #当条件为真,执行代码块1,否则执行代码块2 # 多选一 没有e ...