Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Il tipo di dati BIT di SQL Server genera rapporti diversi per le query Visualizza e Tabella

Il tipo di dati bit viene interpretato dai client in modo diverso. SSMS, riporterà un 1 o 0 per un po' lo stesso 1/0 viene interpretato dal flusso di dati di un SSIS come True o False .

Il fatto che l'origine sia una tabella o una vista non ha importanza per SSIS a meno che tu non modifichi esplicitamente il tipo di dati.

Per la configurazione, ho creato 2 tabelle e una vista

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

A questo punto, se utilizzo SSMS e interrogo dbo.BaseTable o dbo.MyView, otterrò 1 e 0. Ma ancora una volta, questi sono solo artefatti della presentazione. In C, 0 è falso e qualsiasi valore numerico diverso da 0 è vero. Excel lo presenterà come FALSO e VERO. Ogni cliente interpreterà il valore in qualunque sia la rappresentazione locale di un valore booleano. La SSIS ha scelto Vero e Falso.

Ho creato un semplice pacchetto che estrae i dati da BaseTable o MyView e li scrive su un file di testo e una tabella.

Il flusso di controllo di base appare così

Il flusso di dati sembra complesso ma non lo è.

Seleziono dalla mia tabella o dalla vista, aggiungo una descrizione per la mia tabella di destinazione, utilizzo un multicast in modo da poter inviare gli stessi dati a più destinazioni e quindi scrivere su un file e una tabella.

Se interrogo SSMS per le mie origini e destinazioni, vedrai che le librerie di destinazione gestiscono la traduzione tra la rappresentazione locale ed esterna del tipo di dati.

Non è disponibile una tale traduzione per un file flat perché non esiste uno "standard" per la rappresentazione di un booleano. Mi potrebbe piacere Y/N. Anche così, il

Ho provato una serie di cose per forzare un 1/0 da scrivere sul file flat. Ho impostato i miei tipi di dati su

  • Booleano DT_BOOL
  • Singolo byte firmato int DT_I1
  • Quattro byte firmato int DT_I4
  • Stringa DT_STR

ma non ha mai avuto importanza (il che in realtà sembra strano dato quanto sia perspicace SSIS sui tipi di dati) --- il mio output era sempre lo stesso

False,Falsification
True,True dat

In definitiva, se volevo uno 0 o un 1 in quel file di output, dovevo cambiare il mio tipo di dati:nella query di origine con un cast esplicito o tramite un componente Colonna derivata usando l'operatore ternario SomeBit ? (DT_I1)1 : (DT_I1)0 . Usa DT_I1/I2/I4/I8 come meglio credi

Curiosità divertente:se hai scelto di utilizzare il componente Conversione dati, otterrai 0 per False, -1 per True o se utilizzi un cast pigro nel componente derivato (DT_I1) SomeBit Sembra che seguano l'interpretazione C dei valori booleani.

Bilancialo

Non c'è bisogno di credermi sulla parola. Utilizzando le definizioni della tabella sopra e la popolazione di valori, se installi il componente aggiuntivo gratuito BIDS Helper puoi generare lo stesso codice per qualsiasi versione di SSIS.

Dopo aver installato BIDS Helper, fare clic con il pulsante destro del mouse su un progetto SSIS e nel menu contestuale selezionare Aggiungi file Biml. Sostituisci il contenuto di quel file con il codice seguente; salva e fai clic con il pulsante destro del mouse per generare un nuovo pacchetto.

Dovrai modificare i valori per la connessione file flat in modo che punti a posizioni valide, nonché puntare la vecchia stringa di connessione db a qualsiasi punto in cui giri le tabelle.

<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>