SQL Server BIT数据类型对View和Table查询的报告方式不同

时间:2015-03-24 23:35:19

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

我需要根据视图从SQL Server 2012导出数据。在测试下游系统的导出时,我手动从视图所基于的表中提取数据,并且BIT数据类型列报告为1/0。

但是,一旦我针对表设置视图,我注意到BIT数据类型列报告为TRUE / FALSE。无论是对视图执行选择还是从视图中导出,都会发生这种情况。

为什么会发生这种情况?如何在视图中保持与数据表(1/0)相同的结果?

2 个答案:

答案 0 :(得分:1)

客户端以不同方式解释位数据类型。 SSMS将报告10一点,而SSIS的数据流将同一1/0解释为TrueFalse

除非您明确更改数据类型,否则无论是表还是视图,都不会产生SSIS。

对于设置,我创建了2个表和一个视图

CREATE TABLE dbo.BaseTable
(
    SomeBit bit NOT NULL
,   RowDescription varchar(50) NOT NULL
);
CREATE TABLE dbo.TargetTable
(
    SomeBit bit NOT NULL
,   RowDescription varchar(50) NOT NULL
,   SourcePackage nvarchar(100) NOT NULL
);
GO
CREATE VIEW dbo.MyView
AS
SELECT
    BT.SomeBit
,   BT.RowDescription
FROM
    dbo.BaseTable AS BT;
GO
INSERT INTO 
    dbo.BaseTable
(
    SomeBit
,   RowDescription
)
VALUES
    (CAST(0 AS bit), 'Falsification')
,   (CAST(1 AS bit), 'True dat');
GO

此时,如果我使用SSMS并查询dbo.BaseTable或dbo.MyView,我将返回1和0.但同样,这些只是演示文稿的工件。在C中,0为假,任何非0的数值都为真。 Excel将其显示为FALSE和TRUE。每个客户端都会将值解释为布尔值的本地表示形式。 SSIS选择了True and False。

我构建了一个简单的包,它从BaseTable或MyView中提取数据并将其写入文本文件和表格。

因此基本控制流程如此

enter image description here

数据流看起来很复杂,但事实并非如此。

enter image description here

我从我的表或视图中选择,为我的目标表添加描述,使用多播,这样我就可以将相同的数据发送到多个目的地,然后写入文件和表。

如果我查询SSMS的源和目的地,您会看到目标库处理数据类型的本地和外部表示之间的转换。

enter image description here

平面文件没有这样的翻译,因为布尔值的表示没有“标准”。我可能喜欢Y / N.即便如此,

我尝试了很多东西来强制将1/0写入平面文件。我将数据类型设置为

enter image description here

  • Boolean DT_BOOL
  • 单字节签名int DT_I1
  • 四个字节符号int DT_I4
  • String DT_STR

但它永远不重要(考虑到SSIS对数据类型的不确定性,实际上看起来很奇怪)---我的输出始终是相同的

False,Falsification
True,True dat

最终,如果我想在输出文件中输入0或1,我需要更改我的数据类型:使用显式强制转换的源查询或使用三元运算符SomeBit ? (DT_I1)1 : (DT_I1)0的派生列组件。根据需要使用DT_I1 / I2 / I4 / I8

有趣的琐事说明:如果您选择使用数据转换组件,您将获得0表示False,-1表示True或如果您在派生组件(DT_I1) SomeBit中使用延迟演员表它似乎遵循布尔值的C解释。

Biml it

不需要接受我的话。使用上面的表定义和值的总和,如果安装了免费的插件BIDS Helper,您可以为任何版本的SSIS生成相同的代码。

安装BIDS Helper后,右键单击SSIS项目,然后在上下文菜单中选择Add Biml file。用以下代码替换该文件的内容;保存,然后右键单击以生成新包。

您需要编辑平面文件连接的值以指向有效位置,并将ole db连接字符串指向您旋转表格的位置。

<Biml xmlns="http://schemas.varigence.com/biml.xsd">
    <Connections>
        <FlatFileConnection FilePath="C:\ssisdata\so_29244868.table.csv" FileFormat="FFF_table" Name="FF_Table" />
        <FlatFileConnection FilePath="C:\ssisdata\so_29244868.view.csv" FileFormat="FFF_table" Name="FF_View" />
        <OleDbConnection Name="CM_OLE" ConnectionString="Data Source=localhost\dev2014;Initial Catalog=tempdb;Provider=SQLNCLI11.0;Integrated Security=SSPI;" />
    </Connections>
    <FileFormats>
        <FlatFileFormat
            Name="FFF_table" IsUnicode="false" CodePage="1252"
            FlatFileType="RaggedRight">
            <Columns>
                <Column Name="SomeBit" DataType="Boolean" Delimiter="," />
                <Column Name="RowDescription" DataType="AnsiString" Length="50" Delimiter="CRLF"/>
            </Columns>

        </FlatFileFormat>
    </FileFormats>
    <Packages>
        <Package ConstraintMode="Parallel" Name="so_29244868">
            <Tasks>
                <Dataflow Name="DFT Table example">
                    <Transformations>
                        <OleDbSource ConnectionName="CM_OLE" Name="OLE_SRC dbo_BaseTable">
                            <ExternalTableInput Table="dbo.BaseTable" />
                        </OleDbSource>
                        <DerivedColumns Name="DER Package name">
                            <Columns>
                                <Column DataType="String" Name="SourcePackage" Length="100">"DFT Table example"</Column>
                            </Columns>
                        </DerivedColumns>
                        <Multicast Name="MC Dupe">
                            <OutputPaths>
                                <OutputPath Name="FF" />
                                <OutputPath Name="Table" />
                            </OutputPaths>
                        </Multicast>
                        <FlatFileDestination ConnectionName="FF_Table" Name="FF_DST table">
                            <InputPath OutputPathName="MC Dupe.FF" />
                        </FlatFileDestination>
                        <OleDbDestination 
                            ConnectionName="CM_OLE" 
                            Name="OLE_DST Table"
                            TableLock="false">
                            <InputPath OutputPathName="MC Dupe.Table" />
                            <ExternalTableOutput Table="[dbo].[TargetTable]"></ExternalTableOutput>
                        </OleDbDestination>
                    </Transformations>
                </Dataflow>
                <Dataflow Name="DFT View example">
                    <Transformations>
                        <OleDbSource ConnectionName="CM_OLE" Name="OLE_SRC dbo_MyView">
                            <ExternalTableInput Table="dbo.MyView" />
                        </OleDbSource>
                        <DerivedColumns Name="DER Package name">
                            <Columns>
                                <Column DataType="String" Name="SourcePackage" Length="100">"DFT View example"</Column>
                            </Columns>
                        </DerivedColumns>
                        <Multicast Name="MC Dupe">
                            <OutputPaths>
                                <OutputPath Name="FF" />
                                <OutputPath Name="Table" />
                            </OutputPaths>
                        </Multicast>
                        <FlatFileDestination ConnectionName="FF_View" Name="FF_DST view">
                            <InputPath OutputPathName="MC Dupe.FF" />
                        </FlatFileDestination>
                        <OleDbDestination 
                            ConnectionName="CM_OLE" 
                            Name="OLE_DST view"
                            TableLock="false"
                            >
                            <InputPath OutputPathName="MC Dupe.Table" />
                            <ExternalTableOutput Table="[dbo].[TargetTable]"></ExternalTableOutput>
                        </OleDbDestination>
                    </Transformations>
                </Dataflow>
            </Tasks>
        </Package>
    </Packages>
</Biml>

答案 1 :(得分:-1)

我使用Entity Framework遇到了同样的问题。

尝试将位字段转换为位。