• 利用脚本修改SQL SERVER排序规则


    利用脚本修改SQL SERVER排序规则

      

     

    编写人:CC阿爸

     

    2014-3-1

     

    l  今年的一项重要工作是对公司所用系统进行繁简的转换,程序转成简体基本很容易解决,但数据库转换成简体,就没那么容易了。经测试发现,简体的数据库,可以完美的支持到繁简体同时存储,并且不用更换任何数据类型,没想到SQL升级到2005后,微软如此的厚爱大陆市场,其它的话不多说了,罗列一下,本次转换数据库的相关步骤,

    从网上看到有部分好人,有相关的转换代码,其根源是老外写的,但往往直接拿来用是不行的,还必须对其进行修正,该代码只考虑了,约速束主键和外键,未考虑到检查约束,统计信息,因此决定还是写在博客中,方便日后查找,需要的同学可供参考。

    经过在网上搜索部分解决方案,在此基础上进行修正,解决方案才是正解。

    USE ECM_CN
    GO  
    SET ANSI_NULLS ON  
    GO
    SET QUOTED_IDENTIFIER ON   
    GO
    IF EXISTS (SELECT 1 FROM sysobjects WHERE id=OBJECT_ID(N'ScriptCreateTableKeys') AND OBJECTPROPERTY(id, 'IsProcedure') =1)  
    DROP PROCEDURE ScriptCreateTableKeys; 
    GO 
    --================================================================================================================  
    --        ProcedureName        :            ScriptCreateTableKeys 
    --        Author                :            KevinZhang      
    --        CreateDate            :            2014-02-18  
    --        Description            :     生成数据库里指定表的Constraints,Primary Key, Foreign Key, Index的创建脚本.  
    /*****************************************************************************************************************  
    Parameters            :                                    参数说明 
    ****************************************************************************************************************** 
    @table_name            :                    数据库用户表的名字
    ******************************************************************************************************************
     Modified Date    Modified User       Version                 Modified Reason  
    ******************************************************************************************************************  
     2013-11-06        KevinZhang         V01.00.00     修改生成脚本的输出方式,将其写入表CreateTableKeys  
     2013-11-08        KevinZhang         V01.00.01     Fix生成索引的一些bugs: 
                                                        1: 非唯一索引不生成索引 
                                                        2:索引type_des为HEAP的索引也会生成。
    ******************************************************************************************************************/  
    --================================================================================================================  
    CREATE PROC [dbo].[ScriptCreateTableKeys]  
         @table_name varchar(50)  
     AS  
     BEGIN  
        SET NOCOUNT ON  
       
       --Note: Disabled keys and constraints are ignored  
       --TODO: Drop and re-create referencing XML indexes, FTS catalogs  
         DECLARE @crlf CHAR(2)  
         SET @crlf = CHAR(13) + CHAR(10)  
         DECLARE @version CHAR(4)  
         SET @version = SUBSTRING(@@VERSION, LEN('Microsoft SQL Server') + 2, 4)  
         DECLARE @object_id INT  
         SET @object_id = OBJECT_ID(@table_name)  
         DECLARE @sql NVARCHAR(MAX)  
    IF @version NOT IN ('2005', '2008')  
    BEGIN  
      RAISERROR('This script only supports SQL Server 2005 and 2008', 16, 1)  
      RETURN 
    END  
    
    SET @sql = '' +  
     'SELECT ' +  
        'CASE ' +  
            'WHEN 1 IN (i.is_primary_key, i.is_unique_constraint) THEN ' +  
                '''ALTER TABLE '' + ' +  
                    'QUOTENAME(OBJECT_SCHEMA_NAME(i.object_id)) + ''.'' + ' +  
                    'QUOTENAME(OBJECT_NAME(i.object_id)) + @crlf + ' +  
                 '''ADD '' + ' +  
                    'CASE k.is_system_named ' +  
                         'WHEN 0 THEN ''CONSTRAINT '' + QUOTENAME(k.name) + @crlf ' +  
                        'ELSE '''' ' +  
                       'END + ' +  
                 'CASE k.type ' +  
                    'WHEN ''UQ'' THEN ''UNIQUE'' ' +  
                     'ELSE ''PRIMARY KEY'' ' +  
                 'END + '' '' + ' +  
                   'i.type_desc  + @crlf + ' +  
                   'kc.key_columns + @crlf ' +  
             'ELSE ' +  
                '''CREATE '' + CASE WHEN i.is_unique = 1 THEN '' UNIQUE '' ELSE '''' end + i.type_desc + '' INDEX '' + ' +  
                    'QUOTENAME(i.name) + @crlf + ' +  
                '''ON '' + ' +  
                    'QUOTENAME(OBJECT_SCHEMA_NAME(i.object_id)) + ''.'' + ' +  
                    'QUOTENAME(OBJECT_NAME(i.object_id)) + @crlf + ' +  
                                         'kc.key_columns + @crlf + ' +  
                                        'COALESCE ' + '( ' + '''INCLUDE '' + @crlf + ' +  
               '''( '' + @crlf + ' + 
                 'STUFF ' +  
                   '('+'('+'SELECT '+'('+'SELECT ' +''','' + @crlf + '' '' + QUOTENAME(c.name) AS [text()] ' + 'FROM sys.index_columns AS ic ' +  
                    'JOIN sys.columns AS c ON ' +  
                    'c.object_id = ic.object_id ' + 
                    'AND c.column_id = ic.column_id ' + 
                             'WHERE ' + 
                                'ic.object_id = i.object_id ' + 
                                  'AND ic.index_id = i.index_id ' + 
                                       'AND ic.is_included_column = 1 ' + 
                                            'ORDER BY ' + 
                                                'ic.key_ordinal ' + 
                                                      'FOR XML PATH(''''), TYPE ' + 
                                                       ').value(''.'', ''VARCHAR(MAX)'') ' + 
                        '), ' +'1, ' +'3, ' + ''''' ' +') + @crlf + ' + ''')'' + @crlf, ' + ''''' ' +') ' + 'END + ' +'''WITH '' + @crlf + ' + '''('' + @crlf + ' + ''' PAD_INDEX = '' + ' + 
                        'CASE CONVERT(VARCHAR, i.is_padded) ' +'WHEN 1 THEN ''ON'' ' + 'ELSE ''OFF'' ' + 'END + '','' + @crlf + ' +'CASE i.fill_factor ' +'WHEN 0 THEN '''' ' + 
                        'ELSE ' + 
                        ''' FILLFACTOR = '' + ' + 
                             'CONVERT(VARCHAR, i.fill_factor) + '','' + @crlf ' + 
                          'END + ' + 
                        ''' IGNORE_DUP_KEY = '' + ' + 
                        'CASE CONVERT(VARCHAR, i.ignore_dup_key) ' + 
                           'WHEN 1 THEN ''ON'' ' + 
                            'ELSE ''OFF'' ' + 
                            'END + '','' + @crlf + ' + 
                            ''' ALLOW_ROW_LOCKS = '' + ' +'CASE CONVERT(VARCHAR, i.allow_row_locks) ' +'WHEN 1 THEN ''ON'' ' + 'ELSE ''OFF'' ' + 'END + '','' + @crlf + ' +''' ALLOW_PAGE_LOCKS = '' + ' + 
                                                              'CASE CONVERT(VARCHAR, i.allow_page_locks) ' + 
                                                                'WHEN 1 THEN ''ON'' ' + 
                                                                  'ELSE ''OFF'' ' + 
                                                                   'END + ' + 
                                               
                            CASE @version 
                              WHEN '2005' THEN '' 
                              ELSE  
                               ''','' + @crlf + ' + 
                                 ''' DATA_COMPRESSION = '' + ' +
                                  '( ' +
                                    'SELECT ' + 
                                       'CASE ' + 
                               'WHEN MIN(p.data_compression_desc) =  
                                  MAX(p.data_compression_desc) 
                                   THEN MAX(p.data_compression_desc) ' +
                                       'ELSE ''[PARTITIONS USE  
                                            MULTIPLE COMPRESSION TYPES]'' ' + 
                                                   'END ' + 
                                                    'FROM sys.partitions AS p ' +
                                                          'WHERE ' +
                                                            'p.object_id = i.object_id ' +
                                                                           'AND p.index_id = i.index_id ' + 
                         ') ' 
                          END +
                           '+ @crlf + ' +''') '' + @crlf + ' +'''ON '' + ds.data_space + '';'' + ' +'@crlf + @crlf COLLATE database_default AS [-- Create Candidate Keys] ' + 
                        'FROM sys.indexes AS i ' + 'LEFT OUTER JOIN sys.key_constraints AS k ON ' +'k.parent_object_id = i.object_id ' + 'AND k.unique_index_id = i.index_id ' + 
                        'CROSS APPLY ' + 
                        '( ' + 'SELECT ' +'''( '' + @crlf + ' +'STUFF ' +'( ' +'( ' + 
                             'SELECT ' +
                               '( ' + 
                                   'SELECT ' + 
                                       ''','' + @crlf + '' '' + QUOTENAME(c.name) AS [text()] ' + 
                                              'FROM sys.index_columns AS ic ' +
                                                 'JOIN sys.columns AS c ON ' + 
                                                      'c.object_id = ic.object_id ' + 
                                                           'AND c.column_id = ic.column_id ' + 
                                                            'WHERE ' + 
                                                              'ic.object_id = i.object_id ' + 
                                                                   'AND ic.index_id = i.index_id ' +   
                                                                       'AND ic.key_ordinal > 0 ' +
                                                                           'ORDER BY ' + 
                                                                             'ic.key_ordinal ' + 
                                                                                  'FOR XML PATH(''''), TYPE ' + 
                                                                                           ').value(''.'', ''VARCHAR(MAX)'') ' +
                                  '), ' + '1, ' +'3, ' + ''''' ' + ') + @crlf + ' + ''')'' ' +') AS kc (key_columns) ' +'CROSS APPLY ' + '( ' + 
                                         'SELECT ' + 'QUOTENAME(d.name) + ' + 
                                          'CASE d.type ' + 
                                           'WHEN ''PS'' THEN ' + 
                                             '+ ' + '''('' + ' + '( ' + 
                                                   'SELECT ' + 
                                                        'QUOTENAME(c.name) ' +
                                                        'FROM sys.index_columns AS ic ' + 
                                                           'JOIN sys.columns AS c ON ' +
                                                                'c.object_id = ic.object_id ' + 
                                                                    'AND c.column_id = ic.column_id ' +
                                                                             'WHERE ' + 
                                                                                'ic.object_id = i.object_id ' +
                               'AND ic.index_id = i.index_id ' + 
                                'AND ic.partition_ordinal = 1 ' + 
                                 ') + ' +  ''')'' ' + 
                                  'ELSE '''' ' +   'END ' + 
                                       'FROM sys.data_spaces AS d ' + 
                                        'WHERE ' + 
                                          'd.data_space_id = i.data_space_id ' + 
                                           ') AS ds (data_space) ' + 
                                           'WHERE ' + 
                                             'i.object_id = @object_id ' + 
                                                --'AND i.is_unique = 1 ' + 
                                                 'AND i.type >=1' + 
                                 
                                 --filtered and hypothetical indexes cannot be candidate keys 
                                 CASE @version 
                                  WHEN '2008' THEN 'AND i.has_filter = 0 ' 
                                   ELSE '' 
                                                END + 
                                                             'AND i.is_hypothetical = 0 ' + 
                                                                          'AND i.is_disabled = 0 ' + 
                                                                                   'ORDER BY ' + 
                                                                                               'i.index_id ' 
                                            --print @sql; 
                                                INSERT INTO  CreateTableKeys 
                                                 EXEC sp_executesql @sql,  N'@object_id INT, @crlf CHAR(2)', 
                                                  @object_id, @crlf 
                                                  INSERT INTO  CreateTableKeys 
                                                  SELECT  'ALTER TABLE ' + QUOTENAME(OBJECT_SCHEMA_NAME(fk.parent_object_id)) + '.' +  QUOTENAME(OBJECT_NAME(fk.parent_object_id)) + @crlf + 
                                            CASE fk.is_not_trusted
                                             WHEN 0 THEN 'WITH CHECK ' 
                                                       ELSE 'WITH NOCHECK '
                                                                END + 'ADD ' +   
                                             CASE fk.is_system_named 
                                            WHEN 0 THEN 'CONSTRAINT ' + QUOTENAME(name) + @crlf 
                                                  ELSE '' 
                                                   END + 
                                            'FOREIGN KEY ' + @crlf +  '( ' + @crlf +  STUFF (( SELECT ( SELECT  ',' + @crlf + ' ' + QUOTENAME(c.name) AS [text()] 
                                             FROM sys.foreign_key_columns AS fc 
                                        JOIN sys.columns AS c ON  c.object_id = fc.parent_object_id   AND c.column_id = fc.parent_column_id 
                                       WHERE   fc.constraint_object_id = fk.object_id 
                                            ORDER BY fc.constraint_column_id 
                                             FOR XML PATH(''), TYPE ).value('.', 'VARCHAR(MAX)')),1,3,'') + @crlf + ')' + 'REFERENCES ' +QUOTENAME(OBJECT_SCHEMA_NAME(fk.referenced_object_id)) + '.' + 
                                              QUOTENAME(OBJECT_NAME(fk.referenced_object_id)) + @crlf +'(' + @crlf +STUFF ((SELECT (SELECT',' + @crlf + ' ' + QUOTENAME(c.name) AS [text()] 
                                              FROM sys.foreign_key_columns AS fc  JOIN sys.columns AS c ON c.object_id = fc.referenced_object_id 
                                              AND c.column_id = fc.referenced_column_id 
                                               WHERE   fc.constraint_object_id = fk.object_id 
                                        ORDER BY   fc.constraint_column_id 
                                         FOR XML PATH(''), TYPE ).value('.', 'VARCHAR(MAX)')),1,3,'' ) + @crlf + ');
                                            GO'
                                             + 
                                          @crlf + @crlf COLLATE database_default AS  [-- Create Referencing FKs] 
                                          FROM sys.foreign_keys AS fk  WHERE  referenced_object_id = @object_id  AND is_disabled = 0  ORDER BY 
                                           key_index_id END 
                                            GO  
                                            
      
    View Code
     /**************************************************************************************************************************************************************/   
    --SQL Script:ScriptDropTableKeys 创建删除指定表的约束、索引的脚本  
    
    GO
    SET ANSI_NULLS ON
    GO 
    SET QUOTED_IDENTIFIER ON 
    GO  
    IF EXISTS (SELECT 1 FROM sysobjects WHERE id=OBJECT_ID(N'ScriptDropTableKeys') AND OBJECTPROPERTY(id, 'IsProcedure') =1) 
    DROP PROCEDURE ScriptDropTableKeys;  
    GO 
    /*=============================================================================================================== */
    --      ProcedureName        :              
    --        Author                :            KevinZhang 
    --        CreateDate            :            2011-09-11  
    --        Description            :            删除数据库里指定表的Constraints,Primary Key, Foreign Key, Index   
    /*****************************************************************************************************************  
    Parameters            :                                    参数说明
    ******************************************************************************************************************  
    @table_name            :                    数据库用户表的名字
    ****************************************************************************************************************** 
    Modified Date    Modified User     Version                 Modified Reason 
    ****************************************************************************************************************** 
    2013-11-06             Kerry         V01.00.00         修改生成脚本的输出方式,将其写入表DropTableKeys 
    2013-12-08             Kerry         V01.00.00         Fix掉脚本中一个小bug: 不生成删除非唯一索引的SQL Script
    *****************************************************************************************************************/
    --============================================================================================================== 
    CREATE PROC [dbo].[ScriptDropTableKeys] 
    @table_name varchar(50)
    AS 
    BEGIN 
    SET NOCOUNT ON 
    --Note: Disabled keys and constraints are ignored 
    --TODO: Drop and re-create referencing XML indexes, FTS catalogs  
    DECLARE @crlf CHAR(2)
    SET @crlf = CHAR(13) + CHAR(10)
     DECLARE @version CHAR(4)
     SET @version = SUBSTRING(@@VERSION, LEN('Microsoft SQL Server') + 2, 4) 
      DECLARE @object_id INT 
      SET @object_id = OBJECT_ID(@table_name) 
       DECLARE @sql NVARCHAR(MAX) 
        IF @version NOT IN ('2005', '2008') 
        BEGIN 
        RAISERROR('This script only supports SQL Server 2005 and 2008', 16, 1) 
         RETURN 
         END 
          INSERT INTO dbo.DropTableKeys 
           SELECT  
           'ALTER TABLE ' + 
           QUOTENAME(OBJECT_SCHEMA_NAME(parent_object_id)) + '.' + 
           QUOTENAME(OBJECT_NAME(parent_object_id)) + @crlf +
           'DROP CONSTRAINT ' + QUOTENAME(name) + ';' +
           @crlf + @crlf COLLATE database_default AS [-- Drop Referencing FKs] 
           FROM sys.foreign_keys  
            WHERE referenced_object_id = @object_id 
            AND is_disabled = 0 
            ORDER BY key_index_id DESC 
            SET @sql = '' +'SELECT ' +'statement AS [-- Drop Candidate Keys] ' +  'FROM ' +  '( ' + 'SELECT ' + 'CASE ' + 
             'WHEN 1 IN (i.is_unique_constraint, i.is_primary_key) THEN ' +  '''ALTER TABLE '' + ' +   'QUOTENAME(OBJECT_SCHEMA_NAME(i.object_id)) + ''.'' + ' + 
            'QUOTENAME(OBJECT_NAME(i.object_id)) + @crlf + ' +  '''DROP CONSTRAINT '' + QUOTENAME(i.name) + '';'' + ' + 
             '@crlf + @crlf COLLATE database_default ' + 'ELSE ' +  '''DROP INDEX '' + QUOTENAME(i.name) + @crlf + ' + '''ON '' + ' +
               'QUOTENAME(OBJECT_SCHEMA_NAME(object_id)) + ''.'' + ' + 
                'QUOTENAME(OBJECT_NAME(object_id)) + '';'' + ' +
                 '@crlf + @crlf COLLATE database_default ' + 
                  'END AS statement, ' + 
                   'i.index_id ' +
                    'FROM sys.indexes AS i ' + 
                     'WHERE ' +  'i.object_id = @object_id ' + 
                     --'AND i.is_unique = 1 ' +
                     ' AND i.type >=1' +
                     --filtered and hypothetical indexes cannot be candidate keys  
                     CASE @version 
                     WHEN '2008' THEN 'AND i.has_filter = 0 ' ELSE '' END +
                      'AND i.is_hypothetical = 0 ' + 
                        'AND i.is_disabled = 0 ' + ') AS x ' +  'ORDER BY ' + 'index_id DESC;' 
                         --PRINT @sql;  
                        INSERT INTO  dbo.DropTableKeys 
                         EXEC sp_executesql @sql,
                          N'@object_id INT, @crlf CHAR(2)', 
                          @object_id, @crlf 
                           END 
                            GO
                            
       
      
      
    View Code
    /**************************************************************************************************************************************************************/                           
    --SQL Script: sp_change_collation_script 创建修改列排序规则的脚本,以及循环调用[ScriptCreateTableKeys] 、ScriptDropTableKeys 生成对应的
     --USE 
     --GO   
     SET ANSI_NULLS ON  
     GO  
      SET QUOTED_IDENTIFIER ON  
       GO  
       IF EXISTS (SELECT 1 FROM sysobjects WHERE id=OBJECT_ID(N'sp_change_collation_script') AND OBJECTPROPERTY(id, 'IsProcedure') =1) 
        DROP PROCEDURE sp_change_collation_script;  
         GO  
    --===============================================================================================  
    --        ProcedureName        :            sp_change_collation_script 
    --        Author                :            KevinZhang 
    --        CreateDate            :            2013-02-18 
    --        Description            :            组合、补全Raymund Macaalay的脚本,生成改变列排序规则的脚本 
    /*************************************************************************************************  
    Parameters            :                                    参数说明 
    **************************************************************************************************  
    @table_name            :                    数据库用户表的名字
    **************************************************************************************************  
    Modified Date    Modified User     Version                 Modified Reason 
    **************************************************************************************************  
    2013-11-6             KevinZhang         V01.00.00           
    *************************************************************************************************/ 
    --===============================================================================================  
    CREATE PROCEDURE [dbo].[sp_change_collation_script]  
     @CollationName varchar(50)  
     AS 
     BEGIN 
      SET NOCOUNT ON 
        DECLARE @SQLText            VARCHAR(MAX) ; 
        DECLARE @TableName            NVARCHAR(255); 
        DECLARE @ColumnName            sysname  ; 
        DECLARE @DataType            NVARCHAR(128); 
        DECLARE @CharacterMaxLen    INT  ; 
        DECLARE @IsNullable            VARCHAR(3); 
        DECLARE @CreateSqlRowNum    INT;  
        DECLARE @DropSqlRowNum        INT; 
        DECLARE MyTableCursor        Cursor  
    FOR  
    SELECT name FROM sys.tables WHERE [type] = 'U' and name <> 'sysdiagrams' ORDER BY name  
    IF NOT EXISTS ( SELECT  1   FROM    dbo.sysobjects  WHERE   id = OBJECT_ID(N'[dbo].[ChangeColCollation]')    AND xtype = 'U' ) 
    BEGIN  
      CREATE TABLE [dbo].[ChangeColCollation] ( SQL_TEXT VARCHAR(MAX) )  
    END  
    ELSE 
      TRUNCATE TABLE [dbo].[ChangeColCollation]; 
    OPEN MyTableCursor;  
    FETCH NEXT FROM MyTableCursor INTO @TableName  
    WHILE @@FETCH_STATUS = 0  
    BEGIN 
      DECLARE MyColumnCursor Cursor 
    FOR  
    SELECT COLUMN_NAME,DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, IS_NULLABLE from INFORMATION_SCHEMA.COLUMNS  
    WHERE table_name = @TableName AND  (Data_Type LIKE '%char%' OR Data_Type LIKE '%text%') AND COLLATION_NAME <> @CollationName 
    ORDER BY ordinal_position   
    Open MyColumnCursor  
    FETCH NEXT FROM MyColumnCursor INTO @ColumnName, @DataType, @CharacterMaxLen, @IsNullable 
          WHILE @@FETCH_STATUS = 0  
            BEGIN 
              SET @SQLText = 'ALTER TABLE ' + @TableName + ' ALTER COLUMN [' + @ColumnName + '] ' + 
                @DataType + '(' + CASE WHEN @CharacterMaxLen = -1 THEN 'MAX' ELSE CAST(@CharacterMaxLen AS VARCHAR(6)) END + 
                              ') COLLATE ' + @CollationName + ' ' +  
            CASE WHEN @IsNullable = 'NO' THEN 'NOT NULL' ELSE 'NULL' END  
                                      --PRINT @SQLText  
              INSERT INTO ChangeColCollation  
                VALUES (@SQLText);  
                FETCH NEXT FROM MyColumnCursor INTO @ColumnName, @DataType,
                   @CharacterMaxLen, @IsNullable  
                      END 
                        CLOSE MyColumnCursor  
                        DEALLOCATE MyColumnCursor  
                        FETCH NEXT FROM MyTableCursor INTO @TableName 
                        END 
                        CLOSE MyTableCursor 
                        --DEALLOCATE MyTableCursor 
                        IF NOT EXISTS ( SELECT  1 
                        FROM    dbo.sysobjects 
                        WHERE   id = OBJECT_ID(N'[dbo].[CreateTableKeys]')   AND xtype = 'U' )
                        BEGIN  CREATE TABLE [dbo].[CreateTableKeys] ( SQL_TEXT VARCHAR(MAX) ) 
                        END  ELSE TRUNCATE TABLE [dbo].[CreateTableKeys]; 
                        IF NOT EXISTS ( SELECT  1  FROM    dbo.sysobjects     WHERE   id = OBJECT_ID(N'[dbo].[DropTableKeys]') 
                        AND XTYPE = 'U' ) 
                        BEGIN 
                        CREATE TABLE dbo.DropTableKeys ( SQL_TEXT VARCHAR(MAX) ) 
                        END  
                        ELSE 
                            TRUNCATE TABLE dbo.DropTableKeys;
                            OPEN MyTableCursor 
                            FETCH NEXT FROM MyTableCursor INTO @TableName 
                            PRINT @TableName  WHILE @@FETCH_STATUS = 0    
                        BEGIN 
                            EXEC ScriptCreateTableKeys @TableName  
                            --生成创建约束、索引等的脚本
                            EXEC ScriptDropTableKeys @TableName     
                            --生成删除约束、索引等的脚本
                            FETCH NEXT FROM MyTableCursor INTO @TableName 
                        END 
                        CLOSE MyTableCursor 
                        DEALLOCATE MyTableCursor 
                        SELECT @CreateSqlRowNum = COUNT(1) FROM dbo.CreateTableKeys; 
                        SELECT @DropSqlRowNum = COUNT(1) FROM dbo.DropTableKeys;
                        IF @CreateSqlRowNum != @DropSqlRowNum 
                          PRINT 'The table CreateTableKeys rows is different from the row of DropTableKeys ,please check the reason' 
                        END 
                        GO
    
      /**************************************************************************************************************************************************************/   
     
     
     
     
    View Code

    ---修改数据库的排序规则时,按如下步骤顺序执行SQL

     ALTER  DATABASE HZEW2_CN  COLLATE  Chinese_PRC_BIN 

      EXEC  sp_change_collation_script 'Chinese_PRC_BIN';  

     --1.产生生成检查约束脚本
    DECLARE @crlf CHAR(2)
    SET @crlf = CHAR(13) + CHAR(10)
     DECLARE @version CHAR(4)
     SET @version = SUBSTRING(@@VERSION, LEN('Microsoft SQL Server') + 2, 4) 
      DECLARE @object_id INT 
      DECLARE @sql NVARCHAR(MAX) 
    IF @version NOT IN ('2005', '2008') 
        BEGIN 
        RAISERROR('This script only supports SQL Server 2005 and 2008', 16, 1) 
         RETURN 
         END 
    DECLARE c1 cursor for 
    select object_id from 
        sys.check_constraints 
        where type = 'C'
    open c1
    fetch next from c1 into @object_id
    while(@@fetch_status=0)
        begin 
    
              select @sql= 'alter table ['+ object_name(parent_object_id) + '] WITH NOCHECK ADD  CONSTRAINT ['+name+'] check ' +definition from 
                 sys.check_constraints     where type = 'C' and object_id=@object_id
                 
                 INSERT INTO  dbo.CreateTableKeys 
                 values(@sql+@crlf) 
            fetch next from c1 into @object_id
        end
    close c1
    deallocate c1  
    第一步
    --2.产生删除检查约束脚本
    DECLARE @crlf CHAR(2)
    SET @crlf = CHAR(13) + CHAR(10)
     DECLARE @version CHAR(4)
     SET @version = SUBSTRING(@@VERSION, LEN('Microsoft SQL Server') + 2, 4) 
      DECLARE @object_id INT 
      DECLARE @sql NVARCHAR(MAX) 
    IF @version NOT IN ('2005', '2008') 
        BEGIN 
        RAISERROR('This script only supports SQL Server 2005 and 2008', 16, 1) 
         RETURN 
         END 
    DECLARE c1 cursor for 
    select object_id from 
        sys.check_constraints 
        where type = 'C'
    open c1
    fetch next from c1 into @object_id
    while(@@fetch_status=0)
        begin 
    
              select @sql= 'alter table ['+ object_name(parent_object_id) + '] drop  constraint ['+name+']; ' from 
                 sys.check_constraints     where type = 'C' and object_id=@object_id
                 
                 INSERT INTO  dbo.DropTableKeys 
                 values(@sql+@crlf) 
            fetch next from c1 into @object_id
        end
    close c1
    deallocate c1  
      
    第二步
     --3执行下表里面的SQL语句  
      SELECT * FROM dbo.DropTableKeys  
    
       
      declare @sqltemp nVARCHAR(255),@id varchar(50)
      SELECT ID=newid(),*, handle=0 into #t1 from DropTableKeys
      while ((select count(*) from #t1 where handle=0)>0)
      begin
           select top 1 @id=ID,@sqltemp=SQL_TEXT from #t1 where  handle=0
          select  @sqltemp as aa
           EXEC sp_executesql @sqltemp 
          update #t1
          set handle=1
          where ID=@id
      end 
      drop table #t1
      
    第三步
    --4执行下表里面的SQL语句
       SELECT * FROM ChangeColCollation 
       declare @sqltemp nVARCHAR(255),@id varchar(50)
      SELECT ID=newid(),*, handle=0 into #t1 from ChangeColCollation
      
      while ((select count(*) from #t1 where handle=0)>0)
      begin
          select top 1 @id=ID,@sqltemp=SQL_TEXT from #t1 where  handle=0
               EXEC sp_executesql @sqltemp 
          update #t1
          set handle=1
          where ID=@id
      end 
      drop table #t1
    第四步
     --5执行下表里面的SQL语句 
       SELECT * FROM dbo.CreateTableKeys
       
    declare @sqltemp nVARCHAR(255),@id varchar(50)
    SELECT ID=newid(),*, handle=0 into #t1 from CreateTableKeys
    while ((select count(*) from #t1 where handle=0)>0)
      begin
          select top 1 @id=ID,@sqltemp=SQL_TEXT from #t1 where  handle=0
           EXEC sp_executesql @sqltemp 
          update #t1
          set handle=1
          where ID=@id
      end 
      drop table #t1
      
    第五步
    /**************************************************************************************************************************************************************/   
      
     --6 最后验证没有问题后,可以删除dbo.CreateTableKeys、dbo.DropTableKeys、dbo.ChangeColCollation等表。修改数据库的排序规则完成。
    drop table CreateTableKeys
    drop table DropTableKeys
    drop table ChangeColCollation
    
    drop proc ScriptCreateTableKeys
    drop proc [sp_change_collation_script]
    drop proc ScriptDropTableKeys
    第六步
    --7部分统计信息要先删除
    /****** Object:  Statistic [hind_318_1]    Script Date: 02/18/2014 10:21:39 ******/
    if  exists (select * from sys.stats where name = N'hind_318_1' and object_id = object_id(N'[dbo].[PINVDTL]'))
    DROP STATISTICS [dbo].[PINVDTL].[hind_318_1]
    GO
    
    USE [HZEW2_CN]
    GO
    
    /****** Object:  Statistic [hind_318_1]    Script Date: 02/18/2014 10:21:40 ******/
    CREATE STATISTICS [hind_318_1] ON [dbo].[PINVDTL]([PINV])
    GO
    第七部分统计信息要先删除
  • 相关阅读:
    Insert Buffering
    B-Tree vs LSM-tree
    MySQL 5.6 死锁演示 及 日志分析
    MySQL索引
    InnoDB的三个关键特性
    MySQL如何优化GROUP BY :松散索引扫描 VS 紧凑索引扫描
    MySql 自适应哈希索引
    母牛的故事
    简单的java程序
    一些变量的比较
  • 原文地址:https://www.cnblogs.com/bribe/p/3601349.html
Copyright © 2020-2023  润新知