Bitdatatypen tolkas olika av klienter. SSMS, kommer att rapportera tillbaka en 1
eller 0
ett tag medan samma 1/0 tolkas av en SSIS:s dataflöde som True
eller False
.
Om källan är en tabell eller en vy spelar ingen roll för SSIS om du inte uttryckligen ändrar datatypen.
För installation skapade jag 2 tabeller och en vy
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
Vid det här laget, om jag använder SSMS och frågar antingen dbo.BaseTable eller dbo.MyView, kommer jag att få tillbaka en 1 och 0. Men återigen, dessa är bara artefakter av presentation. I C är 0 falskt och alla numeriska värden som inte är 0 är sanna. Excel kommer att presentera det som FALSKT och SANT. Varje klient kommer att tolka värdet till vad den lokala representationen av ett booleskt värde än är. SSIS valde True and False.
Jag byggde ut ett enkelt paket som hämtar data från BaseTable eller MyView och skriver det till en textfil och en tabell.
Det grundläggande kontrollflödet ser ut så här
Dataflödet ser komplext ut men det är det inte.
Jag väljer antingen från min tabell eller vy, lägger till en beskrivning för min måltabell, använder en multicast så att jag kan skicka samma data till flera destinationer och sedan skriva till en fil och tabell.
Om jag frågar efter SSMS för mina källor och destinationer ser du att destinationsbiblioteken hanterar översättningen mellan den lokala och utländska representationen av datatypen.
Det finns ingen sådan översättning tillgänglig för en platt fil eftersom det inte finns någon "standard" för representationen av ett booleskt värde. Jag kanske gillar Y/N. Trots det,
Jag försökte ett antal saker för att tvinga en 1/0 att skrivas till den platta filen. Jag ställer in mina datatyper på
- Boolesk DT_BOOL
- Enskild byte signerad int DT_I1
- Fyra byte signerade int DT_I4
- Sträng DT_STR
men det spelade aldrig någon roll (vilket faktiskt verkar konstigt med tanke på hur snäll SSIS är om datatyper) --- min utdata var alltid densamma
False,Falsification
True,True dat
I slutändan, om jag ville ha en 0 eller en 1 i den utdatafilen, behövde jag ändra min datatyp:antingen i källfrågan med en explicit cast eller genom en härledd kolumnkomponent med den ternära operatorn SomeBit ? (DT_I1)1 : (DT_I1)0
. Använd DT_I1/I2/I4/I8 som du vill
Kul trivianotering:om du väljer att använda datakonverteringskomponenten kommer du att få 0 för False, -1 för True eller om du använder en lat cast i den härledda komponenten (DT_I1) SomeBit
Det verkar som om de följer C-tolkningen av booleska värden.
Biml it
Du behöver inte ta mitt ord för det. Med hjälp av ovanstående tabelldefinitioner och värdepopulation, om du installerar det kostnadsfria tillägget BIDS Helper du kan generera samma kod för alla versioner av SSIS.
Efter installation av BIDS Helper, högerklicka på ett SSIS-projekt och välj Lägg till Biml-fil i snabbmenyn. Ersätt innehållet i den filen med koden nedan; spara och högerklicka sedan för att skapa ett nytt paket.
Du måste redigera värdena för Flat File Connection för att peka på giltiga platser samt peka ole db-anslutningssträngen till var du än snurrar upp dina tabeller.
<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>