SQL Server 2008: массовое изменение типа данных - PullRequest
3 голосов
/ 05 сентября 2010

У меня есть база данных SQL Server 2008 со многими таблицами. Я использовал lame datetime datatpe и хочу использовать новый и лучший datetime2. В большинстве мест, где у меня есть поле даты и времени, имя соответствующего столбца равно Timestamp. Можно ли где-нибудь сделать массовое изменение с datatime на datetime2?

Ответы [ 4 ]

5 голосов
/ 05 сентября 2010

Запустите это в Management Studio, скопируйте результат и вставьте в новое окно запроса:

select 'ALTER TABLE ' + OBJECT_NAME(o.object_id) + 
    ' ALTER COLUMN ' + c.name + ' DATETIME2 ' +
    CASE WHEN c.is_nullable = 0 THEN 'NOT NULL' ELSE 'NULL' END 
from sys.objects o
inner join sys.columns c on o.object_id = c.object_id
inner join sys.types t on c.system_type_id = t.system_type_id
where o.type='U'
and c.name = 'Timestamp'
and t.name = 'datetime'
order by OBJECT_NAME(o.object_id)
2 голосов
/ 05 сентября 2010

Изменение типа данных обычно требует ALTER TABLE операторов:

ALTER TABLE myTable ALTER COLUMN timestamp datetime2 [NOT] NULL

Чтобы изменить все столбцы даты и времени на datetime2 в данной базе данных и схеме:

DECLARE @SQL AS NVARCHAR(4000)
DECLARE @table_name AS NVARCHAR(255)
DECLARE @column_name AS NVARCHAR(255)
DECLARE @isnullable AS BIT

DECLARE CUR CURSOR FAST_FORWARD FOR
    SELECT c.table_name, 
           c.column_name, 
           CASE WHEN c.is_nullable = 'YES' THEN 1 ELSE 0 END AS is_nullable
      FROM INFORMATION_SCHEMA.COLUMNS c 
     WHERE c.data_type = 'datetime'
       AND c.table_catalog = 'your_database'
       AND c.table_schema = 'your_schema'
    -- AND c.table_name = 'your_table'

OPEN CUR
FETCH NEXT FROM CUR INTO @table_name, @column_name, @isnullable
WHILE @@FETCH_STATUS = 0
BEGIN
    SELECT @SQL = 'ALTER TABLE ' + @table_name + ' ALTER COLUMN ' + @column_name + ' datetime2' + (CASE WHEN @isnullable = 1 THEN '' ELSE ' NOT' END) + ' NULL;'
    EXEC sp_executesql @SQL
    FETCH NEXT FROM CUR INTO @table_name, @column_name, @isnullable
END

CLOSE CUR;
DEALLOCATE CUR;
1 голос
/ 05 сентября 2010

Это будет немного грубым методом, но вы всегда можете просмотреть все столбцы типа данных datetime, используя представление sys.columns, взять имя таблицы и имя столбца, перебрать этот список с помощью курсора и для каждой записи создайте инструкцию ALTER TABLE следующим образом:

ALTER TABLE @tablename ALTER COLUMN @columnname datetime2

Затем выполните указанное утверждение с EXEC. Очевидно, вам понадобятся разрешения как для запроса sys.columns, так и для ALTER всех этих таблиц ...

Извините, что в этом ответе больше нет кода - на этой машине нет копии SSMS, и он не может запомнить синтаксис всего этого из памяти. :)

0 голосов
/ 05 сентября 2010

Я бы использовал окно запроса и вывел бы все операторы ALTER TABLE , необходимые для этого. После того как вы их все сгенерируете, вы можете запустить результат для базы данных.

если вы выберете из SYSCOLUMNS имена таблиц и полей, которые вы хотите, вы можете сгенерировать операторы, необходимые для изменения всех столбцов в базе данных на datetime2.

ALTER TABLE {tablename} ALTER COLUMN {fieldname} datetime2 [NULL | NOT NULL]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...