更详细地编辑了问题(非常感谢billinkc!),因为建议的答案没有解决问题
我有两个 SQL 表,其中一个 DATE 列。 源 DATE 列采用 varchar 格式,目标列采用日期格式。原始行来自平面文件,过程如下所示。
SSIS 包(见下文)正在将 BIRTHDATE 列从一个临时表移动到另一个临时表中。从头开始到暂存表的平面文件源:在此处输入图像描述
DATE (vachar) 列的派生列:
(DT_STR,40,1252)((TRIM(BDAY) == "" ? 0 : 1) == 0 ? ((DT_STR,40,1252)"19000101") : ((DT_STR,40,1252)(SUBSTRING ((替换(生日,"/","")),5,4) + SUBSTRING((替换(生日,"/","")),3,2) + SUBSTRING((替换(生日,"/ ","")),1,2))))
第二个包尝试将 varchar 转换为 DATE 格式但失败:在此处输入图像描述在此处输入图像描述 第二个表中的目的地格式是 DATE
错误消息:[数据转换 2] 错误:将列“BIRTHDATE”(248) 转换为列“BIRTHDATE”(6) 时数据转换失败。转换返回状态值 2 和状态文本“由于可能丢失数据,无法转换该值。”。
[数据转换 2] 错误:SSIS 错误代码 DTS_E_INDUCEDTRANSFORMFAILUREONERROR。 “Data Conversion.Outputs[Data Conversion Output].Columns[BIRTHDATE]”失败,因为出现错误代码 0xC020907F,并且“Data Conversion.Outputs[Data Conversion Output].Columns[BIRTHDATE]”上的错误行处理指定错误失败。指定组件的指定对象发生错误。在此之前可能会发布错误消息,其中包含有关失败的更多信息。
我确实尝试使用派生列和经常提出的解决方案,但它不起作用。上一个研究解决方案是使用数据转换任务,但这个会返回以下错误。
我错过了什么吗?感谢各位的指点! :)
抱歉,请倒着读。如果您的字符串日期格式为 yyyymmddd 又名 ccyymmdd,则无法在 SSIS 中进行数据转换。如果它是平面文件源组件,然后您可以使用快速解析选项来转换日期。否则,它就会陷入地区主义的可能性之中。
为了让数据转换组件工作,你必须向它提供一个巨大的提示,将分隔符放入其中。
这是我的来源查询。它从 19000101 到 2036-11-22 生成 50k 行
-- Generate dates from 1900-01-01 to 2036-11-22
-- sans dashes
SELECT
CONVERT(char(8), dateadd(day, D.number, '1900-01-01'), 112) As BirthDate
FROM
(
select TOP 50000
CAST((row_number() OVER (ORDER BY (SELECT NULL)) -1) AS int) AS number
FROM
sys.all_columns AS AC
CROSS APPLY
sys.all_columns AS AC1
CROSS APPLY
sys.all_columns AS AC2
) D(number);
我用了两种表达方式。第一个是通过派生列创建一个新列,称为 DT_WSTR 类型的
DelimitedBirthDate
,长度为 10
SUBSTRING([BirthDate], 1, 4) + "-" + SUBSTRING([BirthDate], 5, 2)+ "-" + SUBSTRING([BirthDate], 7, 2)
我创建的第二列是 DT_DATE,名为
DateBirthDate
。我使用与上面相同的表达式,但显式地将结果表达式转换为日期。
(DT_DATE)(SUBSTRING([BirthDate], 1, 4) + "-" + SUBSTRING([BirthDate], 5, 2)+ "-" + SUBSTRING([BirthDate], 7, 2))
最后,我使用数据转换组件创建一个新列
DateDelimitedBirthDate
,它使用 DelimitedBirthDate
作为源,使用 DT_DATE 作为输出数据类型。
您可以使用 Biml 做到这一点。
下载并安装BIDS Helper。
右键单击 SSIS 项目并选择添加新 Biml 文件
将以下代码粘贴到 BimlScript.biml
更改以下第 5 行以指向有效的服务器和可能的提供商。
右键单击 BimlScript.Biml 并选择“生成 SSIS 包”
利润!
<Biml xmlns="http://schemas.varigence.com/biml.xsd">
<Connections>
<Connection
Name="tempdb"
ConnectionString="Data Source=.\dev2014;Initial Catalog=tempdb;Provider=SQLNCLI11.1;Integrated Security=SSPI;"
/>
</Connections>
<Packages>
<Package Name="so_33226370">
<Tasks>
<Dataflow Name="DFT Date conversion">
<Transformations>
<OleDbSource
ConnectionName="tempdb"
Name="OLE_SRC Generate dates">
<DirectInput>
<![CDATA[-- Generate dates from 1900-01-01 to 2036-11-22
-- sans dashes
SELECT
CONVERT(char(8), dateadd(day, D.number, '1900-01-01'), 112) As BirthDate
FROM
(
select TOP 50000
CAST((row_number() OVER (ORDER BY (SELECT NULL)) -1) AS int) AS number
FROM
sys.all_columns AS AC
CROSS APPLY
sys.all_columns AS AC1
CROSS APPLY
sys.all_columns AS AC2
) D(number);
]]>
</DirectInput>
</OleDbSource>
<DerivedColumns Name="DER Generate delimiters">
<Columns>
<Column DataType="String" Name="DelimitedBirthDate" Length="10">SUBSTRING([BirthDate], 1, 4) + "-" + SUBSTRING([BirthDate], 5, 2)+ "-" + SUBSTRING([BirthDate], 7, 2)</Column>
<Column DataType="Date" Name="DateBirthDate">(DT_DATE)(SUBSTRING([BirthDate], 1, 4) + "-" + SUBSTRING([BirthDate], 5, 2)+ "-" + SUBSTRING([BirthDate], 7, 2))</Column>
</Columns>
</DerivedColumns>
<DataConversion Name="DC Convert Delimited">
<Columns>
<Column DataType="Date" SourceColumn="DelimitedBirthDate" TargetColumn="DateDelimitedBirthDate" />
</Columns>
</DataConversion>
<DerivedColumns Name="DER Placeholder"></DerivedColumns>
</Transformations>
</Dataflow>
</Tasks>
</Package>
</Packages>
</Biml>
如果出现NULL值怎么办? 如何更改表达式来处理 NULL?
(DT_DATE)(SUBSTRING([出生日期], 1, 4) + "-" + SUBSTRING([出生日期], 5, 2)+ "-" + SUBSTRING([出生日期], 7, 2))
我尝试过这个但不起作用。 (ISNULL(availability_start) ? (DT_DBTIMESTAMP)NULL :(DT_DATE)(SUBSTRING([出生日期], 1, 4) + "-" + SUBSTRING([出生日期], 5, 2)+ "-" + SUBSTRING([出生日期] , 7, 2))