zoukankan      html  css  js  c++  java
  • 全库修改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

  • 相关阅读:
    JBOSS管理数据库连接
    PowerDesigner使用教程 —— 概念数据模型
    VC Delphi WM_COPYDATA 消息
    VC Delphi WM_COPYDATA
    DELPHI实现键盘勾子
    设置window任务管理器是否可用
    VS2005 MFC使用
    隐藏显示任务栏
    DELPHI实现键盘勾子
    MSN、腾讯QQ、SKYPE、阿里旺旺网页在线客服源代码
  • 原文地址:https://www.cnblogs.com/ykagile/p/10405285.html
Copyright © 2011-2022 走看看