SSIS

时间:2015-10-20 01:01:23

标签: ssis

问题编辑(非常感谢billinkc!)更详细,因为提议的答案并未解决问题

我有两个带有一个DATE列的SQL表。源DATE列位于varchar中,目标位于日期格式。原始行来自Flat File,流程如下所示。 enter image description here

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

DATE(vachar)列的派生列:

(DT_STR,40,1252)((TRIM(BDAY)==""?0:1)== 0?((DT_STR,40,1252)" 19000101&#34 ;):((DT_STR,40,1252)(SUBSTRING((更换(BDAY," /","")),5,4)+ SUBSTRING((REPLACE( BDAY," /","")),3,2)+ SUBSTRING((更换(BDAY," /","& #34)),1,2))))

第二个包正在尝试将varchar转换为DATE格式但是失败:在此输入图像描述在此处输入图像描述 enter image description here enter image description here 第二个表中的目标格式为DATE

错误消息:[数据转换2]错误:转换列" BIRTHDATE"时数据转换失败(248)到#34; BIRTHDATE" (6)。转换返回状态值2和状态文本"由于潜在的数据丢失,无法转换该值。"。

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

我确实尝试使用Derived Column和经常提出的解决方案,但它没有用。最后的研究解决方案是使用数据转换任务,但是这个会在下面返回一个错误。

我错过了什么吗?谢谢你的任何分数! :)

1 个答案:

答案 0 :(得分:1)

抱歉,请向后阅读。如果您的字符串日期格式为yyyymmddd,即ccyymmdd,则无法在SSIS中进行数据转换。如果它是平面文件源组件,然后,您可以使用快速解析选项转换日期。否则,它会陷入地区主义的可能性之中。

为了让数据转换组件发挥作用,您将不得不为它提供一个血腥的大提示,它将分隔符放入其中。

这是我的Source查询。它从19000101到2036-11-22生成5万行

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

我使用两个表达式。第一个是通过派生列创建一个新列,名为DelimitedBirthDate,类型为DT_WSTR,长度为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作为输出数据类型。

enter image description here

你可以用Biml来做到这一点。

  • 下载并安装BIDS Helper

  • 右键单击SSIS项目并选择Add new Biml File

  • 将以下代码粘贴到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>