全库修改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