批量修改数据库表字段类型

    技术2022-05-20  31

    实际使用例子:

          /*--将所需表的某特定数值类型批量转换为其他类型--*/   

        /*--调用示例:E1T04_1996 char(10)-转换为nvarchar(100) --*/ 

     

    set ANSI_NULLS ON

    set QUOTED_IDENTIFIER ON

    go

           CREATE  procedure [dbo].[p_set] 

        as   

        declare  tb   cursor   for   

        SELECT   sql='alter  table  ['+d.name+']  alter column  ['+a.name+'] nvarchar'   

       +' (100)'  FROM     syscolumns     a   

       left   join   systypes   b   on   a.xtype=b.xusertype   

       inner  join   sysobjects d   on   a.id=d.id  and   d.xtype='U'   and d.name='E1T04_1996'  where b.name  ='char'  AND a.length='10'

     

        declare   @sql   varchar(1000)   

        open   tb   

        fetch  next  from  tb   into  @sql   

        while  @@fetch_status   =  0   

        begin   

        exec(@sql)   

        fetch   next  from  tb  INTO  @sql 

        end   

        close   tb   

        deallocate  tb   

     

     

    --

    --DECLARE @sql VARCHAR(1000)

    --select @sql='alter  table  ['+d.name+']  alter column  ['+a.name+'] nvarchar'   

    --    +'(100)'  FROM     syscolumns     a   

    --    left   join   systypes   b   on   a.xtype=b.xusertype   

    --    inner  join   sysobjects d   on   a.id=d.id  and   d.xtype='U'   and d.name='E1T04_1996'  where b.name  ='char'  AND a.length='10'

    --    

    --    PRINT @sql

     

    --------------------------------------------------------------------------------------

     

      批量修改数据库表字段类型 

    2楼   zjcxc     ( 邹建)      回复于  2004-08-11 21:13:16    得分  100 if     exists     (select     *     from     dbo.sysobjects     where     id     =     object_id(N'[dbo].[p_set]')     and     OBJECTPROPERTY(id,     N'IsProcedure')     =     1)        drop     procedure     [dbo].[p_set]        GO             /*--将所有的表中,数值类型由char,varchar改为nchar,nvarchar                 --*/             /*--调用示例:        exec     p_set        --*/        --修改的存储过程        create     procedure     p_set        as        declare     tb     cursor     for        SELECT     sql='alter     table     ['+d.name        +']     alter     column     ['+a.name+']     n'        +b.name+'('+cast(a.length*2     as     varchar)+')'        FROM     syscolumns     a        left     join     systypes     b     on     a.xtype=b.xusertype        inner     join     sysobjects     d     on     a.id=d.id       and     d.xtype='U'     and       d.name<>'dtproperties'        where          b.name     in('char','varchar')        and          not     exists(SELECT     1     FROM     sysobjects     where     xtype='PK'     and     name     in     (        SELECT     name     FROM     sysindexes     WHERE     indid     in(        SELECT     indid     FROM     sysindexkeys     WHERE     id     =     a.id     AND     colid=a.colid        ))) --主键不能修改        order     by     d.name,a.name             declare     @sql     varchar(1000)        open     tb        fetch     next     from     tb     into     @sql        while     @@fetch_status     =     0        begin        exec(@sql)        fetch     next     from     tb     into     @sql        end        close     tb        deallocate     tb        go ---------------------------------------------------------------------------------------------- 作者tag: 数据库设计  批量更改某数据库中所有表中某字段的类型    批量更改某数据库中所有表中某字段的类型

    -- =======================================================

    -- 批量更改某数据库中所有表中某字段的类型

    -- =======================================================

    IF EXISTS (

      SELECT *

        FROM INFORMATION_SCHEMA.ROUTINES

       WHERE SPECIFIC_NAME = N'sp_AlterColumnType'

    )

       DROP PROCEDURE sp_AlterColumnType

    GO

     

    CREATE PROCEDURE sp_AlterColumnType

    AS

    -- =============================================

    -- 循环当前数据库中所有用户建的表

    -- =============================================

    DECLARE @TableName   nvarchar(100)

    DECLARE @TableID  nvarchar(100)

     

    DECLARE cursor_CustomTable CURSOR FOR

    SELECT [name],[ID] FROM sysobjects where type ='U'

     

    OPEN cursor_CustomTable

     

    FETCH NEXT FROM cursor_CustomTable INTO @TableName,@TableID

     

    WHILE @@FETCH_STATUS = 0

    BEGIN

        -- =============================================

        -- 循环当前表中所有列,取出列名和列的类型

        -- =============================================

        DECLARE @ColumnName nvarchar(100)

        DECLARE @ColumnType nvarchar(100)

     

        DECLARE cursor_Column CURSOR FOR

        select [name],xtype from syscolumns where [id] = @TableID and xtype=(select xtype from systypes where name='numeric')

     

        OPEN cursor_Column

        FETCH NEXT FROM cursor_Column INTO @ColumnName,@ColumnType

     

        WHILE @@FETCH_STATUS = 0

        BEGIN

           --在此处修改列类型为numeric(14,2)

           exec('ALTER TABLE '+@TableName +' ALTER COLUMN '+@ColumnName +' numeric(14,2) null')

        

           FETCH NEXT FROM cursor_Column INTO @ColumnName,@ColumnType

     

        END

     

        CLOSE cursor_Column

        DEALLOCATE cursor_Column

     

    -- 循环到下一个表.

    FETCH NEXT FROM cursor_CustomTable INTO @TableName,@TableID

    END

    CLOSE cursor_CustomTable

    DEALLOCATE cursor_CustomTable

    GO

     


    最新回复(0)