4

tl;博士:如何将平面文件中的“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_DBTIMESTAMP for DT,DT_DBTIMESTAMP2 for DT2。

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

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

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

我的偏好:

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

1 回答 1

1

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

DT 的表达式:

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

DT2 的表达式:

DT2 == "NULL" ? NULL(DT_DBTIMESTAMP2, 7) : (DT_DBTIMESTAMP2, 7) DT2
于 2017-11-16T02:22:26.333 回答