2010-03-31 19 views
5

Tengo una base de datos bastante grande que tiene muchas columnas decimales en muchas tablas, el cliente ha cambiado de opinión y quiere que todos los números (decimales) una precisión de 3 dp en lugar de los dos originales. ¿Hay alguna manera rápida de recorrer todas las tablas en una base de datos y cambiar cualquier columna decimal en esa tabla para tener 3.d.p en lugar de 2 d.p?Cambiar la precisión de todas las columnas decimales en cada tabla en la base de datos

el PP está en SQL 2005.

Cualquier ayuda sería grande.

+0

Vi que decía SQL Server, pero no recuerdo cómo hacerlo allí. Sé que si esto fuera Oracle, consultaría all_tab_cols para encontrar las columnas decimales que son x.2 y generaría un script para modificarlas de a una por vez. ¿Es eso lo que preguntas? ¿Simplemente tiene que mirar el maestro DB para encontrar la tabla análoga? – MJB

Respuesta

7

Obtener las columnas de INFORMATION_SCHEMA en función del tipo y escala, a continuación, modificarlos para tener la escala deseada.

declare @col sysname 
declare @tbl sysname 
declare @sql nvarchar(256) 

declare crsFix cursor for 
select table_name, Column_name from information_schema.columns 
where data_type = 'decimal' and Numeric_Scale = 3 
open crsFix 
fetch next from crsFix into @tbl, @col 
while(@@Fetch_Status = 0) 
Begin 
    set @sql = 'Alter table [' + @tbl + '] alter column [' + @col + '] decimal(38,2) ' 
    print @sql 
    exec sp_executesql @sql 
    fetch next from crsFix into @tbl, @col 
End 
close crsFix 
deallocate crsFix 
+0

Fantástico, ¡esto es genial! Me has ahorrado mucho tiempo. ¡Gracias de nuevo! – Jon

+0

Me alegro de poder ayudar. – cmsjr

+0

+1 - buen trabajo! – hunter

1

si puede obtener los nombres de tablas y columnas esto no debe ser tan malo

ALTER TABLE MyTable ALTER COLUMN MyColumn DECIMAL(#,#) 
+0

Hola, gracias por el uso, desafortunadamente es un db bastante grande con muchas tablas y columnas dentro de esas tablas que necesitan cambiar, solo me pregunto si hay una manera de ver todas las tablas y columnas automáticamente y cambiar si es necesario – Jon

0

Basado en @cmsjr sugerencia y otra ayuda de StackOverflow me encontré con la siguiente tsql que lista todas las columnas cuyo tipo de datos es numérico y genera una secuencia de comandos para cada columna que tenemos que modificar.

SELECT c.TABLE_NAME, c.column_name, c.COLUMN_DEFAULT, c.IS_NULLABLE, c.NUMERIC_PRECISION, c.NUMERIC_SCALE 
, 'ALTER TABLE ' + c.TABLE_NAME + ' ALTER COLUMN ' + c.column_name + ' NUMERIC (18,5) ' + CASE c.IS_NULLABLE WHEN 'NO' THEN ' NOT NULL' ELSE ' NULL' END AS script 
FROM INFORMATION_SCHEMA.columns cs 
INNER JOIN INFORMATION_SCHEMA.tables t ON t.table_name = c.table_name 
WHERE c.data_type like 'numeric' AND t.table_type = 'base table' 
--AND c.NUMERIC_PRECISION in (9,18) AND c.NUMERIC_SCALE = 2 
Cuestiones relacionadas