Tipe data bit ditafsirkan oleh klien secara berbeda. SSMS, akan melaporkan kembali 1
atau 0
sebentar sementara 1/0 yang sama ditafsirkan oleh Aliran Data SSIS sebagai True
atau False
.
Apakah sumbernya berupa tabel atau tampilan tidak masalah bagi SSIS kecuali jika Anda secara eksplisit mengubah tipe data.
Untuk penyiapan, saya membuat 2 tabel dan satu tampilan
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
Pada titik ini, jika saya menggunakan SSMS dan menanyakan dbo.BaseTable atau dbo.MyView, saya akan mendapatkan kembali 1 dan 0. Tetapi sekali lagi, ini hanyalah artefak presentasi. Di C, 0 salah dan nilai numerik apa pun yang bukan 0 benar. Excel akan menyajikannya sebagai FALSE dan TRUE. Setiap klien akan menginterpretasikan nilai menjadi representasi lokal dari nilai boolean. SSIS memilih Benar dan Salah.
Saya membuat paket sederhana yang menarik data dari BaseTable atau MyView dan menulisnya ke file teks dan tabel.
Alur kontrol dasar terlihat seperti ini
Aliran data terlihat rumit tetapi sebenarnya tidak.
Saya memilih dari tabel atau tampilan saya, menambahkan deskripsi untuk tabel target saya, menggunakan multicast sehingga saya dapat mengirim data yang sama ke beberapa tujuan dan kemudian menulis ke file dan tabel.
Jika saya meminta SSMS untuk sumber dan tujuan saya, Anda akan melihat bahwa perpustakaan tujuan menangani terjemahan antara representasi lokal dan asing dari tipe data.
Tidak ada terjemahan yang tersedia untuk file datar karena tidak ada "standar" untuk representasi boolean. Aku mungkin menyukai Y/N. Meski begitu,
Saya mencoba beberapa hal untuk memaksa 1/0 ditulis ke file datar. Saya menyetel tipe data saya ke
- Boolean DT_BOOL
- Byte tunggal masuk ke DT_I1
- Empat byte masuk ke DT_I4
- Tali DT_STR
tapi itu tidak masalah (yang sebenarnya tampak aneh mengingat betapa sulitnya SSIS tentang tipe data) --- output saya selalu sama
False,Falsification
True,True dat
Pada akhirnya, jika saya menginginkan 0 atau 1 dalam file keluaran itu, saya perlu mengubah tipe data saya:baik dalam kueri sumber dengan pemeran eksplisit atau melalui komponen Kolom Turunan menggunakan operator ternary SomeBit ? (DT_I1)1 : (DT_I1)0
. Gunakan DT_I1/I2/I4/I8 sesuai keinginan Anda
Catatan trivia yang menyenangkan:jika Anda memilih untuk menggunakan komponen Konversi Data, Anda akan mendapatkan 0 untuk False, -1 untuk True atau jika Anda menggunakan lazy cast di Komponen Turunan (DT_I1) SomeBit
Sepertinya mereka mengikuti interpretasi C dari nilai boolean.
Biml itu
Tidak perlu mengambil kata-kata saya untuk itu. Dengan menggunakan definisi tabel di atas dan populasi nilai, jika Anda memasang addon gratis BIDS Helper Anda dapat membuat kode yang sama untuk versi SSIS apa pun.
Setelah menginstal BIDS Helper, klik kanan pada proyek SSIS dan di menu konteks, pilih Tambahkan file Biml. Ganti isi file tersebut dengan kode di bawah ini; simpan lalu klik kanan untuk membuat paket baru.
Anda perlu mengedit nilai untuk Flat File Connection untuk menunjuk ke lokasi yang valid serta mengarahkan string koneksi ole db ke mana pun Anda memutar tabel.
<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>