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

 
批量修改数据库表字段类型
2007-03-11 12:06
2楼   zjcxc     ( 邹建) 三级钻石用户 该版得分小于等于800000分,大于500000分    回复于 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

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页