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

实际使用例子:

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

    /*--调用示例: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     ( 邹建三级钻石用户 该版得分小于等于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


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值