如何将平面文件中的字符串“NULL”转换为DATETIME或DATETIME2?

时间:2017-11-15 23:35:52

标签: sql-server ssis etl sql-server-data-tools flatfilesource

tl; dr :如何在平面文件中将“NULL”转换为SSDT / SSIS中的NULL?

在SSMS中运行此代码:

/* Run once
SET NOCOUNT ON
CREATE TABLE #source (DT DATETIME, DT2 DATETIME2)
CREATE TABLE #target (DT DATETIME, DT2 DATETIME2)
INSERT INTO #source
VALUES (GETDATE(),GETDATE()),(NULL,NULL),(GETDATE(),'9999-12-31 23:59:59')
*/
-- Cntl-Shift-F, results to CSV with headers
SELECT * FROM #source  

-- Cntl-D, results to grid
INSERT INTO #target
SELECT * FROM #source
SELECT * FROM #target

-- Prep for next run
TRUNCATE TABLE #target

配置SSMS以创建结果,以CSV格式存档:工具 - >选项 - >查询结果 - > SQL Server - >结果到文本:以逗号分隔的下拉菜单,选中在结果集中包括列标题。

您的输出类似于:

DT,DT2
2017-11-16 10:09:31.997,2017-11-16 10:09:31.9970000
NULL,NULL
2017-11-16 10:09:31.997,9999-12-31 23:59:59.0000000

在SSDT中,配置平面文件连接,高级“选项卡”,将列类型设置为DT的DT_DBTIMESTAMP,DT2的DT_DBTIMESTAMP2。

(旁边的问题:任何想法为什么SSDT总是会出错,并将两列都设置为DT_DATE?显然列中有一个时间组件。)

在平面文件源中,配置RetainNulls = True(虽然我认为这是无关紧要的,因为我没有真正的空值,即空白列不包含数据。

如何让SSDT在#target中创建与SSMS相同的结果? IOW,我需要将文本“NULL”转换为目标中的“正确”NULL。

我的偏好:

  1. 平面文件连接和/或平面文件源中的配置技巧,
  2. 派生列(我需要帮助推导),
  3. 脚本组件。

1 个答案:

答案 0 :(得分:1)

您需要将列作为字符串(例如[DT_STR])拉入平面文件源,然后使用带有以下表达式的派生列转换将它们转换为:

DT的表达式:

DT == "NULL" ? NULL(DT_DBTIMESTAMP) : (DT_DBTIMESTAMP) DT

DT2的表达式:

DT2 == "NULL" ? NULL(DT_DBTIMESTAMP2, 7) : (DT_DBTIMESTAMP2, 7) DT2