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

原文请查看https://www.cnblogs.com/Ken-Blogs/p/6676006.html

SQL Server 默认的排序规则是不区分大小写的,具体区分如下:

CaseSensitivity —— CI 指定不区分大小写,CS 指定区分大小写。

AccentSensitivity —— AI 指定不区分重音,AS 指定区分重音。

KanatypeSensitive —— Omitted 指定不区分假名类型,KS 指定区分假名类型。

WidthSensitivity —— Omitted 指定不区分全半角,WS 指定区分全半角。

正常来说,修改数据库的排序规则我们通过SQL 语句或者直接通过SQL Server的管理界面即可更改数据库的排序规则,但是我们的理解好像都错了,通过这两种方式只能对更改后加入的表和字段有效,并不能更改之前已存在的表以及字段的排序规则,这就需要我们每个字段逐一更改,修改代码如下:

ALTER TABLE [表名] ALTER COLUMN [字段名] nvarchar(256) COLLATE Chinese_PRC_CI_AS

这个工程量,想想都大,还好圈子里有高人,具体方法可详见原文出处,也可见下面的代码(直接复制原文),该段代码可直接复制执行

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
--先测试其中一个表
--AND t.name='凭证表'

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

执行完该段代码后,应该还会有一些字段是修改失败的,经验证,有外键关联以及被设置为主键的都会修改失败,可先把这部分的字段修改后再执行该段代码,应该就可以全部修改成功了

另外与排序规则相关的可查看文章:http://blog.51cto.com/jimshu/1095780

原文地址:https://www.cnblogs.com/ykagile/p/10405285.html