全库修改SQL Server现有排序规则

摘要:
SQLServer备份还原后可能遇到排序规则不一致的问题,此时通过统一排序规则可以解决。我们可以先查询当前数据库的需要修改的字段,查询对应的表名、字段名、排序规则、字段类型、以及对应的长度等等,如下:SELECTt.nameAS[Table],c.nameAS[Column],c.collation_nameAS[Collation],TYPE_NAMEAS[TypeName],c.max_lengthAS[TypeLength]FROMsys.columnscRIGHTJOINsys.tablestONc.object_id=t.object_idWHEREc.collation_nameISNOTNULL执行上述语句,可能发现行数比较多,过多的修改量基本上是不可能手动去慢慢修改的,需要通过SQL查询结果统一修改。至此,SQL已自动修改了大部分字段,大大的减少了工作量。

SQL Server备份还原后可能遇到排序规则不一致的问题,此时通过统一排序规则可以解决。详细操作如下:

数据库报错信息:
无法解决 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

执行上述语句,可能发现行数比较多,过多的修改量基本上是不可能手动去慢慢修改的,需要通过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已自动修改了大部分字段,大大的减少了工作量。

感谢原文作者:https://www.cnblogs.com/Ken-Blogs/p/6676006.html

免责声明:文章转载自《全库修改SQL Server现有排序规则》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇微信小程序循环中点击一个元素,其他的元素不发生变化,类似点击一个循环中的语音,其他的不发生点击事件安装UniDAC控件包下篇

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

相关文章

如何设计实时数据平台(技术篇)

  敏捷之歌 我抽数故我存在 | DBus 人人玩转流处理 | Wormhole 就当吾是数据库 | Moonbox 颜值最后十公里 | Davinci 导读:实时数据平台(RTDP,Real-time Data Platform)是一个重要且常见的大数据基础设施平台。在上篇(设计篇)中,我们从现代数仓架构角度和典型数据处理角度介绍了RTDP,并探讨了...

跨时代的分布式数据库 – 阿里云DRDS详解

随着互联网时代的到来,计算机要管理的数据量成指数级别的飞速上涨。而我们完全无法对用户数做出准确的预估,我们的系统所需要支持的用户数很可能在短短的一个月内突然爆发式的增长几千倍,数据也很可能快速的从原来的几百GB飞速上涨到了几百个TB。如果在这爆发的关键时刻,系统不稳定或无法访问,那么对于业务将会是毁灭性的打击。 伴随着这种对于系统性能、成本以及扩展性的新需...

五十款阿里开源软件说明介绍

阿里巴巴的Github代码托管地址:https://github.com/alibaba 通过写这篇文章从开源中国站上面看了很多,也从那里将开源软件的基本的介绍和下载地址拷贝到了文章当中,总体给我的一个感受就是阿里的开源实在太强大了,多到需要花大量的时间去了解。今天写这篇文章主要是对阿里开源的项目比较陌生,通过本文也有了一个大体的认知。每个人每天有24小时...

精通 Oracle+Python 事务和大型对象

通过 Python 管理数据事务、处理大型对象 事务包含一组 SQL 语句,这组 SQL 语句构成数据库中的一个逻辑操作,如转帐或信用卡支付操作。将 SQL 语句聚合到一个逻辑组中,其效果完全取决于事务的成败,事务成功则提交更改,事务失败则撤销内部 SQL 的结果(整体撤消)。通过 Python,您可以利用 Oracle 数据库所提供的原子性、一致性、孤立...

SQL Server 存储过程具体解释

SQL Server 存储过程具体解释 存储过程的优缺点   ◆长处:   运行速度更快。存储过程仅仅在创造时进行编译,而一般SQL语句每运行一次就编译一次,所以使用存储过程运行速度更快。   存储过程用于处理复杂的操作时,程序的可读性更强、网络的负担更小。   使用存储过程封装事务性能更佳。   能有效的放注入,安全性更好。   可维护性高。在...

C#操作Access

C#操作Access数据库的基础知识浅析 C#操作Access数据库的基础知识都有什么呢? C#操作Access数据库的基础知识1. 通过ADO.NET的OleDb相关类来操作Access 主要知识点如下: using System.Data.OleDb;   using System.Data;  连接字符串: String connection...