我需要根据视图从SQL Server 2012导出数据。在测试下游系统的导出时,我手动从视图所基于的表中提取数据,并且BIT数据类型列报告为1/0。
但是,一旦我针对表设置视图,我注意到BIT数据类型列报告为TRUE / FALSE。无论是对视图执行选择还是从视图中导出,都会发生这种情况。
为什么会发生这种情况?如何在视图中保持与数据表(1/0)相同的结果?
答案 0 :(得分:1)
客户端以不同方式解释位数据类型。 SSMS将报告1
或0
一点,而SSIS的数据流将同一1/0解释为True
或False
。
除非您明确更改数据类型,否则无论是表还是视图,都不会产生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中提取数据并将其写入文本文件和表格。
因此基本控制流程如此
数据流看起来很复杂,但事实并非如此。
我从我的表或视图中选择,为我的目标表添加描述,使用多播,这样我就可以将相同的数据发送到多个目的地,然后写入文件和表。
如果我查询SSMS的源和目的地,您会看到目标库处理数据类型的本地和外部表示之间的转换。
平面文件没有这样的翻译,因为布尔值的表示没有“标准”。我可能喜欢Y / N.即便如此,
我尝试了很多东西来强制将1/0写入平面文件。我将数据类型设置为
但它永远不重要(考虑到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解释。
不需要接受我的话。使用上面的表定义和值的总和,如果安装了免费的插件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遇到了同样的问题。
尝试将位字段转换为位。