• 修改指定表中varchar類型為nvarchar, text為ntext存儲過程


    CREATE PROC SP_CHANGE_TABLE_CHARTYPE
    (
        
    @tableName    nvarchar(128)            --表名
    )
    AS
    DECLARE @varcharTypeId        tinyint            --varchar數據類型編號
    DECLARE @textTypeId            tinyint            --text數據類型編號
    DECLARE @ColumnName            nvarchar(128)    --系統列名
    DECLARE @CType                VARCHAR(1)        --類型
    DECLARE @IsNullAble            char(1)            --是否允許為空
    DECLARE @Length                int                --欄位長度
    DECLARE @ColumnType            int                --列類型
    DECLARE @DCName                nvarchar(128)    --默認值約束名稱
    DECLARE @DCValue            nvarchar(max)    --默認值約束表達式
    DECLARE @CCName                nvarchar(128)    --自定義約束名稱
    DECLARE @CCValue            nvarchar(max)    --自定義約束表達式
    DECLARE @objectid            int
    DECLARE @sqlstr                nvarchar(max)

    IF NOT EXISTS(SELECT * FROM sys.tables WHERE name=@tableName)
    BEGIN
        
    RAISERROR('數據表不存在,請確認表名是否正確!'161)
        
    RETURN
    END
    SET @objectid=OBJECT_ID(@tableName)

    --取得varchar, text類別編碼,名稱不能重複,可通過名稱查詢【已測試過】
    SELECT @varcharTypeId=system_type_id FROM sys.types WHERE name='varchar'
    SELECT @textTypeId=system_type_id FROM sys.types WHERE name='text'

    --取得主鍵列名
    SELECT    COL_NAME(IC.object_id, IC.column_id) AS ColumnName
    INTO    #PrimaryColumn
    FROM    sys.index_columns AS IC
    LEFT JOIN sys.indexes AS I ON I.object_id=IC.object_id AND I.index_id=IC.index_id
    WHERE    I.is_primary_key=1
        
    AND IC.object_id=@objectid

    --更新類型
    DECLARE cur_columns_varchar CURSOR STATIC FOR
        
    --查找非主鍵varchar, text類型字段並找出相應默認值及約束
        SELECT    C.name AS ColumnName, C.is_nullable, D.name AS DCName, D.definition AS DCValue,
                CK.name 
    AS CCName, CK.definition AS CCValue, C.max_length, C.system_type_id
        
    FROM    sys.columns AS C                                                                                        --系統字段視圖
        LEFT JOIN sys.default_constraints AS D ON D.parent_object_id=C.object_id AND D.parent_column_id=C.column_id        --默認值視圖
        LEFT JOIN sys.check_constraints AS CK ON CK.parent_object_id=C.object_id AND CK.parent_column_id=C.column_id    --約束視圖
        WHERE    C.object_id=@objectid
            
    AND (C.system_type_id=@varcharTypeId OR C.system_type_id=@textTypeId)
            
    AND NOT EXISTS(SELECT * FROM #PrimaryColumn WHERE ColumnName=C.name)
    OPEN cur_columns_varchar
    FETCH next FROM cur_columns_varchar INTO 
                
    @ColumnName@IsNullAble@DCName@DCValue,
                
    @CCName@CCValue@Length@ColumnType
    WHILE(@@FETCH_STATUS=0)
    BEGIN
        
    SET @sqlstr=''
        
    --默認值約束不為空
        IF @DCName IS NOT NULL
            
    SET @sqlstr='ALTER TABLE '+@tableName+' DROP CONSTRAINT '+@DCName+';'
        
        
    --自定義約束不為空
        IF @CCName IS NOT NULL
            
    SET @sqlstr=@sqlstr+'ALTER TABLE '+@tableName+' DROP CONSTRAINT '+@CCName+';'
        
        
    --更改數據類型
        IF @ColumnType=@varcharTypeId        --varchar
        BEGIN
            
    SET @sqlstr=@sqlstr+'ALTER TABLE '+@tableName+' ALTER COLUMN '+@ColumnName+' NVARCHAR('+CAST(@Length AS VARCHAR)+')'
            
    IF @IsNullAble=0
            
    BEGIN
                
    SET @sqlstr=@sqlstr+' NOT NULL'
            
    END
            
        
    END
        
    ELSE                                --text
        BEGIN
            
    SET @sqlstr=@sqlstr+'ALTER TABLE '+@tableName+' ADD TMP__'+@ColumnName+' ntext;'
            
    EXEC(@sqlstr)
            
            
    --+CHAR(10)+'GO'+CHAR(10)
            SET @sqlstr='UPDATE '+@tableName+' SET TMP__'+@ColumnName+'='+@ColumnName
                        
    +';ALTER TABLE '+@tableName+' DROP COLUMN '+@ColumnName
                        
    +';EXEC sp_rename '+CHAR(34)+@tableName+'.TMP__'+@ColumnName+CHAR(34)+''+CHAR(34)+@ColumnName+CHAR(34)+''+CHAR(34)+'COLUMN'+CHAR(34)
        
    END
        
    SET @sqlstr=@sqlstr+';'
        
        
    --默認值約束不為空
        IF @DCName IS NOT NULL
            
    SET @sqlstr=@sqlstr+'ALTER TABLE '+@tableName+' ADD CONSTRAINT '+@DCName+' DEFAULT '+@DCValue+' FOR '+@ColumnName+';'
        
        
    --自定義約束不為空
        IF @CCName IS NOT NULL
            
    SET @sqlstr=@sqlstr+'ALTER TABLE '+@tableName+' ADD CONSTRAINT '+@CCName+' CHECK ('+@CCValue+');'
        
        
    --執行
        --SELECT @sqlstr
        EXEC(@sqlstr)
        
    FETCH next FROM cur_columns_varchar INTO 
                
    @ColumnName@IsNullAble@DCName@DCValue,
                
    @CCName@CCValue@Length@ColumnType
    END
    CLOSE cur_columns_varchar
    DEALLOCATE cur_columns_varchar

    DROP TABLE #PrimaryColumn
  • 相关阅读:
    【cocos2d-js官方文档】二、资源管理器Assets Manager
    【cocos2d-js官方文档】七、CCFileUtils
    【cocos2d-js官方文档】九、cc.loader
    【cocos2d-js官方文档】十二、对象缓冲池
    【cocos2d-js官方文档】十二、对象缓冲池
    【cocos2d-js官方文档】二十一、v3相对于v2版本的api变动
    【cocos2d-js教程】cocos2d-js 遮挡层(禁止触摸事件传递层)
    cocos2d-js中怎么删除一个精灵
    MS Chart 折线图——去除时间中的时、分、秒,按天统计【转】
    MS Chart 条状图【转】
  • 原文地址:https://www.cnblogs.com/ywkpl/p/2045523.html
Copyright © 2020-2023  润新知