【问题标题】:How to transform data with SSIS Transfer SQL Server Objects Task?如何使用 SSIS 传输 SQL Server 对象任务转换数据?
【发布时间】:2019-02-25 07:37:46
【问题描述】:

我正在创建一个 SSIS 包以在不同服务器上的数据库之间传输表。源数据库上的时间戳采用 UTC,我想使用 [CallConnectedTime] AT TIME ZONE 'UTC' AT TIME ZONE 'Pacific Standard Time' AS CallConnectedTime 将其转换为我的本地时间。

如何在传输 SQL 对象任务中进行这种转换?我考虑过使用数据流任务,但后来我需要为我带来的每个表创建一个。

【问题讨论】:

  • 添加了几个标签,修正了一些小错别字

标签: sql-server ssis etl timestamp-with-timezone


【解决方案1】:

传输 SQL Server 对象任务不允许您定义任何数据转换。

如果您不想走创建多个数据流任务的路线,您可以在传输任务运行后创建一个表名的 ADO 记录集,然后创建一个 Foreach 循环来迭代 ADO 记录集。为此,您可以在执行 SQL 任务中使用以下查询,将 ResultSet 设置为 Full result set

SELECT Name 
FROM sys.tables
WHERE type_desc = 'USER_TABLE'

将结果集映射到 Object 变量类型。然后,您可以使用 ADO 枚举器创建 Foreach 循环,将其指向您的 Object 变量,然后创建另一个变量来保存 Name 字段的值。

使用现在包含 Name 字段的变量,在 Foreach 循环内创建另一个执行 SQL 任务。此 Execute SQL 任务将构建并执行动态 SQL 语句,该语句将通过设置 CallConnectedTime 来更新表。

循环中的执行 SQL 任务将如下所示:

DECLARE @query NVARCHAR(MAX)
DECLARE @Table VARCHAR(1000) = ?

SET @query = N'
UPDATE ' + @Table + N'
SET CallConnectedTime = CallConnectedTime AT TIME ZONE ''UTC'' AT TIME ZONE ''Pacific Standard Time'''

EXEC(@query)

在编辑器左侧窗格的Parameter Mapping 下,您可以将表名称变量添加为参数名称0,如下所示:

当您完成上述步骤后,您的控制流应该看起来像这样(忽略错误图标)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多