То, как мы решили эту проблему, является чем-то особенным для нашей системы, но может быть полезным для других.У нас есть пользовательский тип, UtcDateTime
, определенный как:
CREATE TYPE [dbo].[UtcDateTime] FROM [datetime] NOT NULL
Поскольку мы обновляем столбец как UTC, а не время сервера, также имеет смысл изменить тип данных.Таким образом, мы можем проверить, не был ли тип данных уже изменен в столбце, чтобы избежать многократного выполнения преобразования.
IF NOT EXISTS(
SELECT 1
FROM sys.tables t
INNER JOIN sys.columns c
ON t.object_id = c.object_id
INNER JOIN sys.types ty
ON c.user_type_id = ty.user_type_id
WHERE t.object_id = object_id( 'SOME_TABLE' )
AND c.name = 'LastModified'
AND ty.name = 'utcdatetime'
)
BEGIN
SET XACT_ABORT ON;
BEGIN TRANSACTION;
ALTER TABLE SOME_TABLE
ALTER COLUMN [LastModified] UTCDATETIME
UPDATE SOME_TABLE
SET LastModified = [dbo].[f_ServerToUTC]( LastModified )
COMMIT TRANSACTION;
END