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

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

原文地址:https://www.cnblogs.com/fjzhang/p/11250019.html

时间: 2024-08-03 12:43:42

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

SQL SERVER 的排序规则

有时候查询数据库的时候会发现(比如做重名检查的时候):数据库的查询时对大小写不敏感的,也就是 A 和 a 是一样的. 也就是说 select * from tabletest where name = 'a' 和 select * from tabletest where name = 'A' 两条 sql 语句的执行结果是一样的. 该怎么办呢...百度了一下,才了解到这关系到了 SQL SERVER 的排序规则.之前在安装 SQL SERVER 的时候曾经见到过这个选项,但是一直没明白是啥意思

[转]SQL SERVER 的排序规则

如何更改SQL SERVER 2000的排序规则 Alter datebase Alter datebase 数据库 Chinese_PRC_BIN ALTER TABLE tb ALTER COLUMN colname nvarchar(100) COLLATE Chinese_PRC_CI_AS --不区分大小写 ALTER TABLE tb ALTER COLUMN colname nvarchar(100) COLLATE Chinese_PRC_CS_AS --区分大小写 使用如下命令

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

不同的排序规则的字段是不能直接比较的.会提示:无法解决 equal to 操作的排序规则冲突.可以把字段强制转换一个排序规则,这样就能比较了.示例: -------------------------------------- SELECT *FROM tab1 a LEFT OUTER JOIN      tab2 u ON a.AdmissionNo = u.UserName COLLATE Chinese_PRC_CI_AS --------------------------------

修改SQL Service数据库排序规则

修改数据库 alter   database   KidsPang   COLLATE   Chinese_PRC_CI_AS 修改表中字段ALTER TABLE [Member] ALTER COLUMN [ID] [nvarchar](10) COLLATE Chinese_PRC_CI_AS  NOT NULLALTER TABLE [Member] ALTER COLUMN [PASS] [nvarchar](43) COLLATE Chinese_PRC_CI_AS  NOT NULL

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

转自:http://blog.51cto.com/jimshu/1095780 概念与详情请参考:字符编码与排序规则:https://www.cnblogs.com/gered/p/9145123.html 一.修改SQL Server服务器(实例)的排序规则 以下实验使用了SQL Server 2008 R2的默认实例,将Chinese_PRC_CI_AS修改成SQL_Latin1_General_CP1_CI_AS. 1. 停止SQL Server实例服务 2. 打开"命令提示符"

修改sqlserver2008数据库的排序规则 (转)

修改SQL server 2008服务器排序规则 SQL Server 2008安装好后,发现服务器排序规则不对,又不想重装SQL Server. 假设当前默认实例的服务器排序规则是:Chinese_PRC_CI_AS,要修改成SQL_Latin1_General_CP1_CI_AS 步骤: 在CMD模式 1. 进入SQL Server 安装文件所在目录(setup.exe文件所在目录) 2. 运行命令:Net stop mssqlserver 3. Setup /QUIET /ACTION=R

向SQL Server 现有表中添加新列并添加描述.

注: sql server 2005 及以上支持. 版本估计是不支持(工作环境2005,2008). 工作需要, 需要向SQL Server 现有表中添加新列并添加描述. 从而有个如下存储过程. (先附上存储过程然后解释) 代码 /********调用方法********** 作用: 添加列并添加列描述信息 调用: exec [SetColumnInfo] '表名', '列名', N'列说明,描述','列类型{默认:NVARCHAR(50)}','列默认值{默认:NULL}' *********

目录:第4章 修改SQL Server安装

第4章 修改SQL Server安装 4.1  添加实例和组件 4.2  修复SQL Server安装 4.3  安装BI解决方案集成开发环境 4.4  安装补丁和更新程序 4.5  卸载SQL Server

修改sql server sa用户密码

EXEC sp_password NULL, 'NewPassword', 'Sa' 修改sql server sa用户密码