У меня есть база данных SQL Server 2008 со многими таблицами. Я использую теперь lame datetime
тип данных и хочу использовать новое и лучшее datetime2
. В большинстве мест, где у меня есть поле datetime, соответствующее имя столбца равно Timestamp
. Есть ли где-нибудь сделать массовое изменение от datatime
до datetime2
?SQL Server 2008: Изменение типа массового набора
ответ
Это было бы немного методы грубой силы, но вы всегда можете посмотреть все столбцы типа данных datetime
используя sys.columns
вид, возьмите имя таблицы и столбец, перебирать этот список с курсором и каждый элемент генерирует оператор ALTER TABLE, например, так:
ALTER TABLE @tablename ALTER COLUMN @columnname datetime2
Затем запустите сказал заявление с EXEC
. Очевидно, что у вас должны быть разрешения как для запроса sys.columns
, так и для ALTER
всех этих таблиц ...
Извините, что в этом ответе нет более кода - на нем нет копии SSMS, и не может запомнить синтаксис для всего этого из памяти. :)
Я бы использовал окно запроса и вывел все операторы ALTER TABLE, необходимые для этого. После того, как все они сгенерированы, вы можете запустить результат по базе данных.
Если вы выберете из SYSCOLUMNS имена таблиц и полей, которые вы хотите, вы можете сгенерировать операторы, необходимые для изменения всех столбцов в базе данных до datetime2
.
ALTER TABLE {tablename} ALTER COLUMN {fieldname} datetime2 [NULL | NOT NULL]
Выполнить это в 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)
Единственное, что я изменил, это использовать 'sys.tables' вместо' sys.objects', чтобы найти имя таблицы –
тип изменения данных обычно требуется 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;
Отличный ответ, получает мой голос. Я бы всегда переносил такой код в транзакцию, хотя на всякий случай что-то пошло не так. Также обратите внимание, что приведенный выше сценарий завершится с ошибкой, если у вас есть ограничения на столбец (например, как по умолчанию, который вставляет getdate()). – rmcsharry
Но вы можете решить эту проблему, отбросив их (http://stackoverflow.com/questions/4215619/how-to-drop-all-default-constraints-in-a-database), а затем снова добавив их. – rmcsharry
- 1. Изменение домена SQL Server 2008
- 2. Изменение типа данных столбца таблицы в SQL Server 2008
- 3. Изменение драйвера tempDB SQL Server 2008 R2
- 4. Изменение режима восстановления SQL Server 2008
- 5. Изменение строк в SQL Server 2008
- 6. Изменение часового пояса SQL Server 2008
- 7. Изменение формата даты в SQL Server 2008
- 8. Изменение структуры таблиц в SQl Server 2008
- 9. Изменение типа данных столбца в SQL Server
- 10. Изменение типа данных, не отбрасывая таблицу в sql-сервере 2008
- 11. Изменение типа данных столбца в SQL Server
- 12. Изменение SP в SQL Server 2008 с использованием SQL-запроса
- 13. Изменение имени базы данных SQL Fails Sql Server 2008
- 14. Ускорение массового ввода в SQL Server 2005
- 15. MS SQL Server 2008 Кодировка
- 16. Получить начало и окончание набора данных в SQL Server 2008
- 17. C# -> Извлечение набора данных из SQL Server 2008
- 18. Самый эффективный способ поддержки «набора» в SQL Server 2008?
- 19. Изменение набора изменений SQL
- 20. SQL Server 2008 - Хранение файлов
- 21. Сохраненная процедура SQL Server 2008
- 22. Обновление SQL Server 2005 SQL Server 2008
- 23. SQL Server 2008 Безопасность
- 24. SQL Server 2008 CAL
- 25. SQL Server 2008 sp1
- 26. SQL Server 2008 Союз
- 27. Отладчик SQL Server 2008
- 28. ms sql server 2008
- 29. SQL Server 2008 OPENROWSET
- 30. sql server 2008
Он подразумевает «объемный», я полагаю. –
изменен объемный и объемный объем. облегчает понимание;) – devio