2010-09-05 4 views
3

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

+2

Он подразумевает «объемный», я полагаю. –

+0

изменен объемный и объемный объем. облегчает понимание;) – devio

ответ

1

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

ALTER TABLE @tablename ALTER COLUMN @columnname datetime2 

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

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

0

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

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

ALTER TABLE {tablename} ALTER COLUMN {fieldname} datetime2 [NULL | NOT NULL] 
5

Выполнить это в 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) 
+0

Единственное, что я изменил, это использовать 'sys.tables' вместо' sys.objects', чтобы найти имя таблицы –

2

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

ALTER TABLE myTable ALTER COLUMN timestamp datetime2 [NOT] NULL 

изменить все DateTime столбцов в 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; 
+0

Отличный ответ, получает мой голос. Я бы всегда переносил такой код в транзакцию, хотя на всякий случай что-то пошло не так. Также обратите внимание, что приведенный выше сценарий завершится с ошибкой, если у вас есть ограничения на столбец (например, как по умолчанию, который вставляет getdate()). – rmcsharry

+0

Но вы можете решить эту проблему, отбросив их (http://stackoverflow.com/questions/4215619/how-to-drop-all-default-constraints-in-a-database), а затем снова добавив их. – rmcsharry

Смежные вопросы