设为首页 收藏本站
查看: 979|回复: 0

[经验分享] 全库修改SQL Server现有排序规则

[复制链接]

尚未签到

发表于 2017-12-13 22:01:44 | 显示全部楼层 |阅读模式
  近日,在项目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 [表名]>  

  但是数据库中还有很多排序为“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行...
DSC0000.png

  所以,过多的修改量基本上是不可能手动去慢慢修改的,需要通过SQL查询结果统一修改。
  我是将结果集插入到临时表中,在通过循环临时表,exec执行拼接SQL语句去修改每一个记录,具体代码如下:

DSC0001.gif DSC0002.gif   

DECLARE @table NVARCHAR(128)  
DECLARE @column NVARCHAR(128)
  
DECLARE @type NVARCHAR(128)
  
DECLARE @typeLenght NVARCHAR(128)
  
DECLARE @sql NVARCHAR(MAX )
  

  
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
  

  

  
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
  

  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
  


  SET @sql='>  + @column + '] ' + @type + '(' + @typeLenght
  + ') COLLATE Chinese_PRC_CI_AS'
  

  

  BEGIN TRY
  EXEC(@sql)
  END TRY
  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
  


View Code  执行SQL,更新出错的try catch查询结果如下:
DSC0003.png

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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-423828-1-1.html 上篇帖子: Sql Server 日志自动清理 下篇帖子: SQL SERVER 修改带有默认值约束的列类型
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表