Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Tipe data SQL Server BIT melaporkan secara berbeda untuk kueri Tampilan dan Tabel

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>


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Apakah indeks berkerumun harus unik?

  2. Bagaimana menghindari kondisi balapan basis data saat secara manual menambah PK dari baris baru

  3. SQL:Normalisasi database sambil mempertahankan batasan

  4. Cara Menampilkan Query dan Hasil di Tab Terpisah di SQL Server Management Studio (SSMS) - Tutorial SQL Server / TSQL Part 15

  5. Bagaimana saya bisa memasukkan 10 juta catatan dalam waktu sesingkat mungkin?