全库修改SQL Server现有排序规则
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了全库修改SQL Server现有排序规则,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3148字,纯文字阅读大概需要5分钟。
内容图文
![全库修改SQL Server现有排序规则](/upload/InfoBanner/zyjiaocheng/511/da081fdb34bb4083a7e8f859a0624ae6.jpg)
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现有排序规则
标签:-- sys gen 长度 catch 报错 error arch har
本文系统来源:https://www.cnblogs.com/fjzhang/p/11250019.html
内容总结
以上是互联网集市为您收集整理的全库修改SQL Server现有排序规则全部内容,希望文章能够帮你解决全库修改SQL Server现有排序规则所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。