Sqlserver——日常维护——批量修改表中列的数据类型

 下面实例,是将表'Table1','Table2','Table3'中的decima类型的数据全部更改为decimal(20,4)

其中'fn_split' 是分割函数,将输入的字符串按','分割成需要的结果集

BEGIN


IF EXISTS(SELECT * FROM sys.objects WHERE object_id=OBJECT_ID('Temp_A'))
DROP TABLE Temp_A

SELECT  *,IDENTITY(INT,1,1) SerialNum INTO Temp_A
FROM  dbo.fn_split('Table1','Table2','Table3', ',')


IF EXISTS(SELECT * FROM sys.objects WHERE object_id=OBJECT_ID('Temp_B'))
DROP TABLE Temp_B

CREATE TABLE Temp_B(ColumnName NVARCHAR(MAX),SerialNum INT IDENTITY)

--表名
DECLARE @ObjectName NVARCHAR(MAX)
--列名
DECLARE @ColumnName NVARCHAR(MAX)

DECLARE @SQL NVARCHAR(MAX)

---外循环
DECLARE @I1 INT =1

DECLARE @Q1 INT =(SELECT COUNT(*) FROM Temp_A)


---内循环
DECLARE @I2 INT =1

DECLARE @Q2 INT =0


--外循环
WHILE @I1 <= @Q1
    BEGIN

        DELETE  Temp_B;

        DBCC CHECKIDENT (Temp_B,reseed,0) 

        SET @ObjectName = ( SELECT  splitcolumn FROM   Temp_A WHERE   SerialNum = @I1);

        INSERT  INTO Temp_B
                ( ColumnName
                )
                SELECT  syscolumns.name
                FROM    syscolumns ,
                        systypes
                WHERE   syscolumns.xusertype = systypes.xusertype
                        AND syscolumns.id = OBJECT_ID(@ObjectName)
                        AND sys.systypes.name = 'decimal';

        SET @Q2 = ( SELECT  COUNT(*)FROM    Temp_B);

        --内循环

        WHILE @I2 <= @Q2
            BEGIN

                SET @ColumnName = ( SELECT  ColumnName
                                    FROM    Temp_B
                                    WHERE   SerialNum = @I2
                                  );

                SET @SQL = 'ALTER TABLE ' + @ObjectName + ' ALTER COLUMN '+ @ColumnName + ' DECIMAL(20,4) ';

                EXEC (@SQL);

                SET @I2 = @I2 + 1;
            END;

        SET @I2 =1
        SET @I1 = @I1 + 1;
    END;

    IF EXISTS(SELECT * FROM sys.objects WHERE object_id=OBJECT_ID('Temp_A'))
    DROP TABLE Temp_A
    IF EXISTS(SELECT * FROM sys.objects WHERE object_id=OBJECT_ID('Temp_B'))
    DROP TABLE Temp_B


END


 

 

你可能感兴趣的:(Sqlserver——日常维护——批量修改表中列的数据类型)