Изменить точность всех десятичных столбцов в каждой таблице в базе данных - PullRequest
5 голосов
/ 01 апреля 2010

У меня довольно большая база данных, в которой есть много десятичных столбцов во многих таблицах, теперь клиент передумал и хочет, чтобы все числа (десятичные дроби) имели точность 3 д.п. вместо оригинальных двух. Есть ли какой-нибудь быстрый способ просмотреть все таблицы в базе данных и изменить любой десятичный столбец в этой таблице на 3.d.p вместо 2 d.p?

БД на sql 2005.

Любая помощь будет отличной.

Ответы [ 3 ]

7 голосов
/ 01 апреля 2010

Получить столбцы из 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 голос
/ 01 апреля 2010

Если вы можете получить имена таблиц и столбцов, это не должно быть так плохо

ALTER TABLE MyTable ALTER COLUMN MyColumn DECIMAL(#,#)
0 голосов
/ 04 ноября 2017

Основываясь на предложении @cmsjr и другой помощи от stackoverflow, я придумал следующий tsql, в котором перечислены все столбцы, тип данных которых числовой, и генерирует сценарий для каждого столбца, который нам нужно изменить.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...