Buscar este blog

24 septiembre 2008

Cambiar un tipo de datos en todas las columnas

Interesante script que armé en T-SQL para cambiar tipos de datos de todas las columnas de todas las tablas existentes en una base de datos. En mi caso necesitaba cambiar todas las columnas decimal(9,3) y decimal(10,3) a columnas decimal(10,4) para soportar números de 10 dígitos enteros y 4 decimales ya que si queremos guardar 4 decimales en un decimal(n,3) el número es redondeado por SQL Server a 3 decimales. Otra situación común para la que puede usarse es para cuando subestimamos o sobreestimamos los campos del tipo "descripción" en nuestras bases de datos, por ejemplo, nos damos cuenta que exageramos con campos varchar(500) y queremos cambiarlos a todos a varchar(200). Espero que les sirva.
-- VARIABLES  
DECLARE @tblName0 NVARCHAR(150)
DECLARE @tblName NVARCHAR(150)
DECLARE @colName NVARCHAR(150)
DECLARE @colDataType NVARCHAR(50)
DECLARE @colNumericPrecision numeric
DECLARE @colNumericScale numeric
DECLARE @cont numeric
-- CURSOR
DECLARE cur_tables CURSOR FOR
select t.table_name, column_name, data_type,
numeric_precision, numeric_scale
from information_schema.columns c
inner join information_schema.tables t
on c.table_name=t.table_name
and table_type='BASE TABLE'
and data_type='decimal'
and (numeric_precision=9 or numeric_precision=10)
and numeric_scale=3
OPEN cur_tables
FETCH NEXT FROM cur_tables INTO @tblName, @colName, @colDataType,
@colNumericPrecision, @colNumericScale
SET @tblName0=''
SET @cont=0
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC('alter table ' + @tblName +
' alter column ' + @colName + ' decimal(10,4)')
SET @cont=@cont+1
IF @tblName<>@tblName0
BEGIN
SET @tblName0=@tblName
PRINT '--------------------'
PRINT @tblName
PRINT '--------------------'
END

PRINT char(9) + @colName + ' se ha cambiado de: ' + @colDataType + (' +
cast(@colNumericPrecision as nvarchar(50)) + ',' +
cast(@colNumericScale as nvarchar(50)) + ')' + ' a Decimal(10,4)'

FETCH NEXT FROM cur_tables INTO @tblName, @colName , @colDataType,
@colNumericPrecision, @colNumericScale
END
PRINT '----------------------------------------------------------'
PRINT cast(@cont as nvarchar(10)) + ' columnas afectadas.'
CLOSE cur_tables
DEALLOCATE cur_tables

No hay comentarios.: