更改数据库中每个表中所有十进制列的精度

时间:2010-03-31 20:06:58

标签: sql sql-server-2005

我有一个相当大的数据库,在很多表中有很多十进制列,客户现在已经改变主意,并希望所有数字(小数)的精度为3 d.p.而不是原来的两个。有没有快速的方法来遍历数据库中的所有表并更改该表中的任何十进制列以具有3.d.p而不是2 d.p?

db在sql 2005上。

任何帮助都会很棒。

3 个答案:

答案 0 :(得分:7)

根据类型和比例从information_schema中获取列,然后将其更改为具有所需的比例。

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

答案 1 :(得分:1)

如果你能获得表名和列名,那就不应该这么糟糕了

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

答案 2 :(得分:0)

基于@cmsjr建议和stackoverflow的其他帮助,我提出了以下tsql,它列出了数据类型为numeric的所有列,并为我们需要修改的每一列生成一个脚本。

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