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。
我的偏好:
答案 0 :(得分:1)
您需要将列作为字符串(例如[DT_STR])拉入平面文件源,然后使用带有以下表达式的派生列转换将它们转换为:
DT的表达式:
DT == "NULL" ? NULL(DT_DBTIMESTAMP) : (DT_DBTIMESTAMP) DT
DT2的表达式:
DT2 == "NULL" ? NULL(DT_DBTIMESTAMP2, 7) : (DT_DBTIMESTAMP2, 7) DT2