Typ danych bitowych jest różnie interpretowany przez klientów. SSMS, zgłosi 1
lub 0
przez chwilę, podczas gdy ten sam 1/0 jest interpretowany przez przepływ danych SSIS jako True
lub False
.
To, czy źródłem jest tabela, czy widok, nie ma znaczenia dla SSIS, chyba że jawnie zmienisz typ danych.
Do konfiguracji utworzyłem 2 tabele i widok
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
W tym momencie, jeśli użyję SSMS i zapytam dbo.BaseTable lub dbo.MyView, otrzymam 1 i 0. Ale znowu, są to tylko artefakty prezentacji. W C 0 to fałsz, a każda wartość liczbowa, która nie jest równa 0, jest prawdziwa. Excel przedstawi to jako FAŁSZ i PRAWDA. Każdy klient zinterpretuje wartość na jakąkolwiek lokalną reprezentację wartości logicznej. Firma SSIS wybrała Prawda i Fałsz.
Zbudowałem prosty pakiet, który pobiera dane z BaseTable lub MyView i zapisuje je do pliku tekstowego i tabeli.
Tak wygląda podstawowy przepływ sterowania
Przepływ danych wygląda na złożony, ale tak nie jest.
Wybieram z mojej tabeli lub widoku, dodaję opis mojej tabeli docelowej, używam multiemisji, aby móc wysyłać te same dane do wielu miejsc docelowych, a następnie pisać do pliku i tabeli.
Jeśli zapytam SSMS o moje źródła i miejsca docelowe, zobaczysz, że biblioteki docelowe obsługują tłumaczenie między lokalną i zagraniczną reprezentacją typu danych.
Takie tłumaczenie nie jest dostępne dla zwykłego pliku, ponieważ nie ma „standardu” reprezentacji wartości logicznej. może lubię T/N. Mimo to
Próbowałem kilku rzeczy, aby wymusić zapisanie 1/0 do pliku płaskiego. Ustawiłem moje typy danych na
- Boole'owskie DT_BOOL
- Pojedynczy bajt podpisany int DT_I1
- Cztery bajty podpisane int DT_I4
- Ciąg DT_STR
ale to nigdy nie miało znaczenia (co w rzeczywistości wydaje się dziwne, biorąc pod uwagę, jak przewrotny SSIS dotyczy typów danych) --- moje dane wyjściowe były zawsze takie same
False,Falsification
True,True dat
Ostatecznie, jeśli chciałem 0 lub 1 w tym pliku wyjściowym, musiałem zmienić mój typ danych:w zapytaniu źródłowym z jawnym rzutowaniem lub przez składnik kolumny pochodnej przy użyciu operatora potrójnego SomeBit ? (DT_I1)1 : (DT_I1)0
. Użyj DT_I1/I2/I4/I8 według własnego uznania
Zabawna ciekawostka:jeśli zdecydujesz się użyć komponentu konwersji danych, otrzymasz 0 za fałsz, -1 za prawdę lub jeśli użyjesz leniwego rzutowania w komponencie pochodnym (DT_I1) SomeBit
Wygląda na to, że są zgodne z interpretacją C wartości logicznych.
Zrób to
Nie musisz mi wierzyć na słowo. Korzystając z powyższych definicji tabeli i populacji wartości, jeśli zainstalujesz bezpłatny dodatek BIDS Helper możesz wygenerować ten sam kod dla dowolnej wersji SSIS.
Po zainstalowaniu BIDS Helper, kliknij prawym przyciskiem myszy projekt SSIS iw menu kontekstowym wybierz Dodaj plik Biml. Zastąp zawartość tego pliku poniższym kodem; zapisz, a następnie kliknij prawym przyciskiem myszy, aby wygenerować nowy pakiet.
Będziesz musiał edytować wartości dla połączenia plików płaskich, aby wskazywały prawidłowe lokalizacje, a także wskazywały ciąg połączenia ole db tam, gdzie rozkręcisz swoje tabele.
<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>