Bitový datový typ je klienty interpretován odlišně. SSMS, ohlásí 1
nebo 0
na chvíli je stejná 1/0 interpretována datovým tokem SSIS jako True
nebo False
.
Pro SSIS nezáleží na tom, zda je zdrojem tabulka nebo pohled, pokud výslovně nezměníte datový typ.
Pro nastavení jsem vytvořil 2 tabulky a pohled
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
V tomto okamžiku, pokud použiji SSMS a dotazuji se buď dbo.BaseTable nebo dbo.MyView, dostanu zpět 1 a 0. Ale opět, toto jsou jen artefakty prezentace. V C je 0 nepravda a jakákoli číselná hodnota, která není 0, je pravdivá. Excel to bude prezentovat jako NEPRAVDA a PRAVDA. Každý klient bude interpretovat hodnotu do jakékoli lokální reprezentace booleovské hodnoty. SSIS zvolil True and False.
Vytvořil jsem jednoduchý balíček, který stahuje data z BaseTable nebo MyView a zapisuje je do textového souboru a tabulky.
Základní řídicí tok vypadá takto
Datový tok vypadá složitě, ale není.
Vybírám ze své tabulky nebo zobrazení, přidávám popis pro svou cílovou tabulku, používám vícesměrové vysílání, abych mohl posílat stejná data do více cílů a poté zapisovat do souboru a tabulky.
Pokud se dotazuji SSMS na své zdroje a cíle, uvidíte, že cílové knihovny zpracovávají překlad mezi místní a zahraniční reprezentací datového typu.
Pro plochý soubor není k dispozici žádný takový překlad, protože neexistuje žádný "standard" pro reprezentaci booleanu. Mohl bych mít rád Y/N. I tak je
Zkoušel jsem řadu věcí, jak vynutit, aby 1/0 byla zapsána do plochého souboru. Nastavil jsem své datové typy na
- Booleovský DT_BOOL
- Jeden bajt podepsaný int DT_I1
- Čtyři bajty podepsané int DT_I4
- Řetězec DT_STR
ale nikdy na tom nezáleželo (což ve skutečnosti vypadá divně vzhledem k tomu, jak persnickety SSIS je o datových typech) --- můj výstup byl vždy stejný
False,Falsification
True,True dat
Nakonec, pokud jsem chtěl v tomto výstupním souboru 0 nebo 1, musel jsem změnit svůj datový typ:buď ve zdrojovém dotazu s explicitním přetypováním, nebo prostřednictvím komponenty Odvozený sloupec pomocí ternárního operátoru SomeBit ? (DT_I1)1 : (DT_I1)0
. Použijte DT_I1/I2/I4/I8, jak uznáte za vhodné
Zábavná drobná poznámka:pokud se rozhodnete použít komponentu Data Conversion, dostanete 0 pro False, -1 pro True nebo pokud použijete líné obsazení v odvozené komponentě (DT_I1) SomeBit
Zdá se, že se řídí C interpretací booleovských hodnot.
Biml to
Není třeba mě brát za slovo. Pomocí výše uvedených definic tabulek a populace hodnot, pokud si nainstalujete bezplatný doplněk Pomocník nabídek můžete vygenerovat stejný kód pro jakoukoli verzi SSIS.
Po instalaci BIDS Helper klikněte pravým tlačítkem na projekt SSIS a v kontextové nabídce vyberte Přidat soubor Biml. Nahraďte obsah tohoto souboru níže uvedeným kódem; uložit a poté kliknutím pravým tlačítkem vygenerovat nový balíček.
Budete muset upravit hodnoty pro připojení s plochým souborem tak, aby ukazovaly na platná umístění, a také nasměrovat připojovací řetězec ole db na místo, kde roztáčíte své tabulky.
<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>