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

时间:2018-09-20 23:06:21

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

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

如何在“传输SQL对象任务”中进行此转换?我曾考虑过使用“数据流任务”,但随后我需要为要移交的每个表创建一个。

1 个答案:

答案 0 :(得分:1)

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

如果您不想走创建多个数据流任务的路线,则可以在Transfer任务运行后创建具有表名的ADO记录集,然后创建一个Foreach循环以遍历ADO记录集。为此,您可以在Execute SQL Task中使用以下查询,并将ResultSet设置为Full result set

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

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

enter image description here

enter image description here

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

然后,循环中的Execute SQL Task看起来像这样:

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下,您将表名变量添加为Parameter Name 0,如下所示:

enter image description here

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

enter image description here

相关问题