SSIS 中的 varchar 到日期格式

varchar to date format in SSIS

已更详细地编辑问题(非常感谢 billinkc!),因为建议的答案没有解决问题

我有两个 SQL table 和一个 DATE 列。源 DATE 列为 varchar,目标为日期格式。原始行来自平面文件,过程如下所示。

SSIS 包(见下文)正在将 BIRTHDATE 列从一个阶段 table 移动到另一个阶段。从头开始平面文件源到暂存 table:在此处输入图像描述

DATE (vachar) 列的派生列:

(DT_STR,40,1252)((TRIM(BDAY) == "" ? 0 : 1) == 0 ? ((DT_STR,40,1252 )"19000101") : ((DT_STR,40,1252)(SUBSTRING((REPLACE(BDAY,"/","")),5,4) + SUBSTRING((REPLACE(BDAY,"/" "")),3,2) + SUBSTRING((REPLACE(BDAY,"/","")),1,2))))

第二个包试图将 varchar 转换为 DATE 格式但失败了:在此处输入图像描述在此处输入图像描述 第二个 table 中的目标格式是 DATE

错误消息:[数据转换 2] 错误:将列 "BIRTHDATE" (248) 转换为列 "BIRTHDATE" (6) 时数据转换失败。转换返回状态值 2 和状态文本 "The value could not be converted because of a potential loss of data.".

[数据转换 2] 错误:SSIS 错误代码 DTS_E_INDUCEDTRANSFORMFAILUREONERROR。 "Data Conversion.Outputs[Data Conversion Output].Columns[BIRTHDATE]" 失败,因为发生了错误代码 0xC020907F,并且 "Data Conversion.Outputs[Data Conversion Output].Columns[BIRTHDATE]" 上的错误行配置指定错误时失败。指定组件的指定对象发生错误。在此之前可能会发布错误消息,其中包含有关失败的更多信息。

我确实尝试将派生列与经常提出的解决方案一起使用,但它没有用。上次研究的解决方案是使用数据转换任务,但这个 returns 下面有一个错误。

我错过了什么吗?感谢任何积分家伙! :)

抱歉,倒着读。如果字符串日期格式为 yyyymmddd aka 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);

我用了两个表达方式。第一个是通过 Derived Column 的新列,称为 DelimitedBirthDate 类型 DT_WSTR length 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 项目并select添加新的 Biml 文件

  • 将以下代码粘贴到BimlScript.biml

  • 更改以下第 5 行以指向有效的服务器和可能的提供商。

  • 右键单击 BimlScript.Biml 和 select "Generate SSIS Packages"

盈利!

<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>