3

是时候在我正在开发的应用程序中将 SQL Server 中的 DateTime 字段迁移到 DateTimeOffset 了。

想知道 SQL Server 中是否有任何自动化工具可以帮助我解决这个问题,所以我不需要编写一堆 alter table 语句的脚本?

4

2 回答 2

6

SQL Server 本身没有这样的工具,但是有 3rd 方工具,可以完成数据库的管理任务并为您生成更改脚本。

在没有第三方工具的情况下,您可以编写一个脚本来为您生成更改脚本。

这是一个示例脚本,它查找所有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的代码为数据库中的每个表执行代码。

于 2013-06-10T10:17:57.403 回答
2

我有类似的问题。

这是我为更新列所做的。我按照我在网上找到的一个示例将 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

尝试使用此函数更改列 - 下面的示例显示如何为 Bi 执行此操作

于 2014-10-24T16:00:11.420 回答