如何使用 SSIS 传输 SQL 服务器对象任务转换数据?

How to transform data with SSIS Transfer SQL Server Objects Task?

我正在创建一个 SSIS 包以在不同服务器上的数据库之间传输 tables。源数据库上的时间戳是 UTC,我想使用 [CallConnectedTime] AT TIME ZONE 'UTC' AT TIME ZONE 'Pacific Standard Time' AS CallConnectedTime.

将其转换为本地时间

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

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

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

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

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

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

循环中的执行 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 下,您可以将 table 名称变量添加为参数名称 0,如下所示:

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