SSIS中的布尔值问题

时间:2015-06-30 18:48:37

标签: sql-server sql-server-2008 ssis

我是SSIS的新手,我正在编写一个将CSV转储到表中的应用程序。该表已经存在,它使用位字段作为布尔值。有趣的是,在这个领域,我可以手动插入0,1,true或false。当我查询表时,即使我插入0或1,它也会给我真或假。

现在,当我尝试使用SSIS输入真或假时,我收到错误。如果我将传入字段设置为布尔值,我就会立即收到错误消息。如果我将类型设置为字符串,我在运行时会收到错误。我也试过从字符串转换为bool或int无效。

有什么想法吗?

谢谢, 埃里克

2 个答案:

答案 0 :(得分:4)

数据流或表达式语言适用于1/0或true / false。但是,当它尝试将布尔值序列化为文本以用于平面文件时,它会将其保存为“true”或“false”。不要问我为什么,我只知道我通过派生列显式地将它们转换为1或0的字符或整数。否则,您最终会遇到截断错误。

在我的数据源中,CarOwner是一种数据类型。在我的派生列中,我将添加一个名为OwnsCar的新列,并使用以下表达式。

CarOwner ? 1 : 0

以下Biml描述了我构建的包。如果您可以免费下载BIDS Helper,则可以将其粘贴到新的Biml文件中,修复以下连接的值(localhost\dev2012,路径c:\ssisdata可能对您无效环境)它将发出一个SSIS包。

<Biml xmlns="http://schemas.varigence.com/biml.xsd">
    <Connections>
        <OleDbConnection 
            ConnectionString="Provider=SQLOLEDB;Data Source=localhost\dev2012;Integrated Security=SSPI;Initial Catalog=tempdb" 
            Name="SRCDB" />
        <FlatFileConnection FilePath="C:\ssisdata\so_31146110" FileFormat="FFF Simple" Name="FF_Boolean" />
    </Connections>
    <FileFormats>
         <FlatFileFormat 
            IsUnicode="false"
            FlatFileType="Delimited"
            Name="FFF Simple">
            <Columns>
                <Column Name="CustomerName" DataType="String" Length="20" Delimiter="Tab" />
                <Column Name="OwnsCar" DataType="Int32" Delimiter="Tab" />
                <Column Name="OwnsTruck" DataType="Int32" Delimiter="CRLF" />
            </Columns>
        </FlatFileFormat>
    </FileFormats>
    <Packages>
        <Package ConstraintMode="Linear" Name="BooleanFlatFile">
            <Variables>
                <Variable Name="QuerySource" DataType="String">
                    <![CDATA[SELECT
    'Customer ' + CAST(ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS varchar(2)) AS CustomerName
,   *
FROM
    (
        VALUES
            (CAST(1 AS bit))
        ,   (CAST(1 AS bit))
        ,   (CAST(0 AS bit))
    ) S(CarOwner)
    CROSS APPLY
    (
        VALUES
            (CAST(1 AS bit))
        ,   (CAST(0 AS bit))
        ,   (CAST(0 AS bit))
        ,   (CAST(0 AS bit))
        ,   (CAST(0 AS bit))
        ,   (CAST(0 AS bit))
    ) F(TruckOwner);
]]></Variable>
            </Variables>
            <Tasks>
                <Dataflow Name="DFT FF_Boolean">
                    <Transformations>
                        <OleDbSource 
                            ConnectionName="SRCDB" 
                            Name="OLESRC Unpivot Source">
                            <VariableInput VariableName="User.QuerySource" />
                        </OleDbSource>

                        <DerivedColumns Name="DER Booleans to ints">
                            <Columns>
                                <Column DataType="Int32" Name="OwnsCar" >CarOwner ? 1 : 0</Column>
                                <Column DataType="Int32" Name="OwnsTruck" >TruckOwner ? 1 : 0</Column>
                            </Columns>
                        </DerivedColumns>

                        <FlatFileDestination ConnectionName="FF_Boolean" Name="FFDST FF_Boolean"></FlatFileDestination>

                    </Transformations>
                </Dataflow>
            </Tasks>
        </Package>
    </Packages>
</Biml>

答案 1 :(得分:0)

我找到了答案。 我已将字段作为字符串导入,然后使用以下公式将变量创建为派生列: (DT_BOOL)(UPPER(RTRIM(ABC))==&#34; TRUE&#34;?1:0)