【问题标题】:Issues with booleans in SSISSSIS 中的布尔值问题
【发布时间】:2015-09-17 17:06:09
【问题描述】:

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

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

有什么想法吗?

谢谢, 埃里克

【问题讨论】:

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


    【解决方案1】:

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

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

    CarOwner ? 1 : 0
    

    以下 Biml 描述了我构建的包。如果您有免费下载,BIDS Helper 您可以将其粘贴到新的 Biml 文件中,修复以下连接的值(localhost\dev2012c:\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>
    

    【讨论】:

    • 所以,我使用以下代码创建了一个派生列: (DT_BOOL)(UPPER(myVar) == "TRUE" ? 1 : 0) 但是,输出都是假的,我检查了数据,它包含许多真值。
    • @billinkc - 嗨!我偶然发现了你的博客,并且玩得很开心。谢谢! :)
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-28
      • 1970-01-01
      • 1970-01-01
      • 2011-04-18
      • 2010-10-02
      • 2019-10-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多