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

How do I convert the string "NULL" in a flat file to DATETIME or DATETIME2?

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 以使用 headers 将结果创建为 CSV 文件:工具 --> 选项 --> 查询结果 --> SQL 服务器 --> 结果到文本:逗号分隔的下拉列表, 选中在结果集中包含列 headers。

您的输出将类似于:

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 中,配置平面文件连接,高级 "tab",将 DT 的列类型设置为 DT_DBTIMESTAMP,DT2 的列类型设置为 DT_DBTIMESTAMP2。

(附带问题:知道为什么 SSDT 总是出错,并将两列都设置为 DT_DATE 吗?显然,这些列具有时间分量。)

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

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

我的偏好:

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

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

DT 的表达式:

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

DT2 的表达式:

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