在我正在处理的应用程序中,已经到了将SQL Server中的DateTime字段迁移到DateTimeOffset的时候了。
想知道是否有任何SQL Server自动化工具可以帮助我完成此操作,这样我就不需要编写一堆alter table语句了吗?
在我正在处理的应用程序中,已经到了将SQL Server中的DateTime字段迁移到DateTimeOffset的时候了。
想知道是否有任何SQL Server自动化工具可以帮助我完成此操作,这样我就不需要编写一堆alter table语句了吗?
在SQL Server本身中没有这样的工具,但是有第三方工具,可以包装数据库管理任务并为您生成更改脚本。
如果没有第三方工具,您可以编写一个脚本,来自动生成更改脚本。
以下是一个示例脚本,它查找所有的datatime
类型列,并生成将其更改为DateTimeOffset
数据类型的脚本。
select
OBJECT_NAME (a.object_id) as Table_Name
,a.name as Colimn_Name
,b.name as Old_Datatype
,'ALTER TABLE ' + OBJECT_NAME (a.object_id) + ' ALTER COLUMN ' + a.name + ' DATETIMEOFFSET ' +
CASE a.is_nullable
when 1 then ' NULL '
else ' NOT NULL '
END
from sys.columns a
join sys.types b on a.user_type_id = b.user_type_id
join sys.tables c on a.object_id = c.object_id
where b.name = 'datetime'
and c.type = 'U'
同时,您还可以使用未记录在案的sp_msForEachTable
来为数据库中的每个表执行代码。
我遇到过类似的问题。
以下是我更新列的方法。我按照在网上找到的示例将 DateTime 列转换为 DateTimeOffset。
例如,对于 NorthWind 数据库,您可以执行以下操作。首先执行创建转换函数的命令:
CREATE FUNCTION fn_DSTOffset( @date1 DATETIMEOFFSET )
RETURNS INT
AS
BEGIN
RETURN
CASE WHEN ( ( @date1 > '2009-3-29 2:00' AND @date1 <= '2009-10-25 2:00' )
OR ( @date1 > '2010-3-28 2:00' AND @date1 <= '2010-10-31 2:00' )
OR ( @date1 > '2011-3-27 2:00' AND @date1 <= '2011-10-30 2:00' ) )
THEN 60 -- offset in minutes
ELSE 0
END
END
GO