下面實例,是將表'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