zoukankan      html  css  js  c++  java
  • [转载]如何将数据库所有表里面的varchar字段批量改成N

    数据库里面大概有2百多张表,每张表都有很多VARCHAR的字段,如何做,才能将数据库里面的所有表,字段类型为VARCHAR的,全部一次性改为NVARCHAR呢?

     

    由于需要考虑到主键外键 约束的问题,所以这个问题变得复杂了许多,现在提供可行的一种方法:

     

    -- xtype = '167' 字段類型為varchar 可用select * from systypes 查看

    Declare  curAlterInfo Cursor For Select a.Name AlterFieldName, a.Length, a.IsNullable, b.Name AlterTableName

                                                        From SysColumns a, SysObjects b Where a.id = b.id and a.xType = '167'

                                                        and b.xType = 'u' and a.cdefault = 0

    declare @AlterFieldName nvarchar(50),  -- 修改的字段

                @AlterTableName nvarchar(50),  -- 修改的表名

                @Length int, -- 字段以長度

                @IsNullable bit, -- 字段是否允許為空

                @PkName nvarchar(50), -- 主鍵名

                @PkFieldName nvarchar(500), --主鍵字段名

                @TmpFieldName nvarchar(50),

                @TmpTableName nvarchar(50),

                @Sql nvarchar(500)

     

    Set NoCount On

    Begin Tran

    open curAlterInfo

    Fetch curAlterInfo Into @AlterFieldName, @Length, @IsNullable, @AlterTableName

    While @@Fetch_Status=0

    Begin

        print @AlterTableName

        --檢查修改的表是否有主鍵

        If Exists(Select Name From SysObjects Where xType = 'PK'

                      and Parent_Obj = (Select id From SysObjects Where Name = @AlterTableName))

        Begin

           Set @TmpTableName = @AlterTableName

           -- 取得主鍵名

           Select @PkName = Name From SysObjects Where xType = 'PK'

                     and Parent_Obj = (Select id From SysObjects Where Name = @AlterTableName)

           Set @PkFieldName = ''

           -- 主鍵字段

           Declare curPkFieldName Cursor For Select b.Name From SysIndexKeys a, SysColumns b

                                                    Where a.id = (Select id From SysIndexes Where Name = @PkName)

                                                    and a.indid = 1 and a.colid = b.colid and a.id = b.id

           -- 取得所有的主鍵字段

           Open curPkFieldName

           Fetch curPkFieldName Into @TmpFieldName

           While @@fetch_status = 0

           Begin

               Set @PkFieldName = @PkFieldName + @TmpFieldName + ','

               Fetch curPkFieldName Into @TmpFieldName

           End

           Close curPkFieldName

           Deallocate curPkFieldName

           -- 刪除舊主鍵

           Set @Sql = 'ALTER TABLE '+ @AlterTableName + ' DROP CONSTRAINT ' + @PkName

           Print @Sql

           Exec(@Sql)   

        end

        -- 修改字段

        Set @Sql = 'ALTER TABLE ' + @AlterTableName + ' ALTER COLUMN ' + @AlterFieldName

                       + ' NVARCHAR( ' + CAST(@Length AS NVARCHAR) + ')'

        -- 是否允許為空

        if @IsNullable = 0

            Set @Sql = @Sql + ' NOT NULL'

        Print @sql

        Exec(@sql)

        Fetch curAlterInfo Into @AlterFieldName, @Length, @IsNullable, @AlterTableName

        -- 創建主鍵

        If (@AlterTableName <> @TmpTableName or @@fetch_status <> 0) and @PkFieldName <> ''

        Begin

             Set @PkFieldName = Left(@PkFieldName, Len(@PkFieldName) - 1)

             Set @Sql =  ' ALTER TABLE ' + @TmpTableName + ' ADD CONSTRAINT ' + @PkName

                            +  ' PRIMARY KEY CLUSTERED(' + @PkFieldName + ') ON [PRIMARY]'

             Print @Sql

             Exec(@Sql)

             print '-----------------------------'

             Set @PkFieldName = ''

        End

    End

    Close curAlterInfo

    Deallocate curAlterInfo

    If @@Error > 0

       Rollback Tran

    Else

       Commit Tran

    Set NoCount Off

  • 相关阅读:
    双向链表的创建,查找,删除
    atoi 函数自实现
    strcmp,strcpy,strcat,strncmp,strncpy,strncat,自实现精炼版本
    天生棋局(堆上申请二维空间的应用)
    使用二级指针,初始化一级指针
    指针数组的简单理解
    输入二进制数,输出10进制数
    阶乘循环联系题
    [剑指offer] 二叉搜索树的第k个节点
    二叉树的序列化和反序列化
  • 原文地址:https://www.cnblogs.com/liuzhuqing/p/7481037.html
Copyright © 2011-2022 走看看