全库修改SQL Server现有排序规则
近日,在项目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现有排序规则的更多相关文章
- 修改SQL Server 的排序规则(转)
转自http://jimshu.blog.51cto.com/3171847/1095780/ 一.修改SQL Server服务器(实例)的排序规则 以下实验使用了SQL Server 2008 R2 ...
- SQL SERVER 的排序规则
有时候查询数据库的时候会发现(比如做重名检查的时候):数据库的查询时对大小写不敏感的,也就是 A 和 a 是一样的. 也就是说 select * from tabletest where name = ...
- SQL Server更改排序规则的实现过程
摘自: http://www.2cto.com/database/201112/115138.html 以下的文章主要向大家描述的是SQL Server更改排序规则的实现过程,以及在实现其实际操作过程 ...
- [转]SQL SERVER 的排序规则
如何更改SQL SERVER 2000的排序规则 -- 增加复合主键语句 Alter Table tableName Add primary key (field1,field2) Alter dat ...
- sql server不同排序规则的数据库间字段的比较
不同的排序规则的字段是不能直接比较的.会提示:无法解决 equal to 操作的排序规则冲突.可以把字段强制转换一个排序规则,这样就能比较了.示例: ------------------------- ...
- SQL SERVER 强制排序规则查询
有时会需要在2个DB之间的数据做比较, 但因为一些原因, 数据库的默认排序规则是不一样的, 例如 SELECT A.Col1, B.Col1, A.* FROM DB1.dbo.A LEFT JOIN ...
- 修改SQL Service数据库排序规则
修改数据库 alter database KidsPang COLLATE Chinese_PRC_CI_AS 修改表中字段ALTER TABLE [Member] ALTER COL ...
- 利用脚本修改SQL SERVER排序规则
利用脚本修改SQL SERVER排序规则 编写人:CC阿爸 2014-3-1 l 今年的一项重要工作是对公司所用系统进行繁简的转换,程序转成简体基本很容易解决,但数据库转换成简体,就没那么容易了.经 ...
- 修改sql server实例、数据库、表、字段的排序规则
转自:http://blog.51cto.com/jimshu/1095780 概念与详情请参考:字符编码与排序规则:https://www.cnblogs.com/gered/p/9145123.h ...
随机推荐
- oracle 换行回车符
工作中碰到这样一种情况,做一个data patch,将表中的某个字段的内容copy到另一个字段,添加时若目标字段有值,需要换行处理. 首先,oracle中的回车符是chr(13),换行符是chr(10 ...
- python中中括号中的负数
>>> a="a,b,c,d,e">>> a.split(",")[0:2]['a', 'b']>>> a ...
- [Ubuntu]清除系统磁盘垃圾
操作步骤: 1.sudo apt-get autoremove(卸载系统中所有未被使用的依赖关系) 2.sudo apt-get clean(清除所有缓存的包文件) 以上操作绿色无害,对系统无影响.
- Node.js 打造实时多人游戏框架
在 Node.js 如火如荼发展的今天,我们已经可以用它来做各种各样的事情.前段时间UP主参加了极客松活动,在这次活动中我们意在做出一款让“低头族”能够更多交流的游戏,核心功能便是 Lan Party ...
- LR中下载文件的脚本
#include "web_api.h" Action(){ int iflen; //文件大小 long lfbody; //响应数据内容大小 web_url("xxx ...
- Javascript 日期格式化
Javascript 日期格式化 需求: 给出:日期 .格式,根据日期格式进行输出. Date.prototype.Format = function (fmt) { //author: meizz ...
- STL:string类中size()与length()的区别
结论是:两者没有任何区别 解释: C++Reference中对于两者的解释: 两者的具体解释都一模一样: 理解: length是因为C语言的习惯而保留下来的,string类最初只有length,引进S ...
- OpenWrite方法打开现有文件并进行写入
实现效果: 知识运用: File类的OpenWrite方法 //实现打开现有文件以进行写入 public static FileStream OpenWrite (string path) Encod ...
- Salt Master报错:Minion did not return. [No response]
在salt master端执行salt ‘*’ test.ping时,某一节点出现如下报错:Minion did not return. [No response] 登陆到这一节点查看minion的日 ...
- 接口和类方法中的 SELF
接口和类方法中的 SELF 由 王巍 (@ONEVCAT) 发布于 2015/06/10 我们在看一些接口的定义时,可能会注意到出现了首字母大写的 Self 出现在类型的位置上: protocol I ...