Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Der SQL Server-BIT-Datentyp gibt für Ansichts- und Tabellenabfragen unterschiedliche Berichte aus

Der Datentyp Bit wird von Clients unterschiedlich interpretiert. SSMS, wird eine 1 zurückmelden oder 0 für ein bisschen, während dieselbe 1/0 vom Datenfluss eines SSIS als True interpretiert wird oder False .

Ob die Quelle eine Tabelle oder eine Ansicht ist, spielt für SSIS keine Rolle, es sei denn, Sie ändern explizit den Datentyp.

Für die Einrichtung habe ich 2 Tabellen und eine Ansicht erstellt

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

Wenn ich an diesem Punkt SSMS verwende und entweder dbo.BaseTable oder dbo.MyView abfrage, erhalte ich eine 1 und 0 zurück. Aber auch dies sind nur Artefakte der Präsentation. In C ist 0 falsch und jeder numerische Wert, der nicht 0 ist, ist wahr. Excel zeigt es als FALSCH und WAHR an. Jeder Client interpretiert den Wert in die lokale Darstellung eines booleschen Werts. SSIS wählte True und False.

Ich habe ein einfaches Paket erstellt, das Daten aus BaseTable oder MyView zieht und in eine Textdatei und eine Tabelle schreibt.

Der grundlegende Kontrollfluss sieht so aus

Der Datenfluss sieht komplex aus, ist es aber nicht.

Ich wähle entweder aus meiner Tabelle oder meiner Ansicht aus, füge eine Beschreibung für meine Zieltabelle hinzu, verwende einen Multicast, damit ich dieselben Daten an mehrere Ziele senden und dann in eine Datei und Tabelle schreiben kann.

Wenn ich SSMS nach meinen Quellen und Zielen abfrage, sehen Sie, dass die Zielbibliotheken die Übersetzung zwischen der lokalen und der fremden Darstellung des Datentyps übernehmen.

Für eine flache Datei ist keine solche Übersetzung verfügbar, da es keinen "Standard" für die Darstellung eines booleschen Werts gibt. Ich könnte J/N mögen. Trotzdem ist die

Ich habe eine Reihe von Dingen versucht, um zu erzwingen, dass eine 1/0 in die Flatfile geschrieben wird. Ich setze meine Datentypen auf

  • Boolean DT_BOOL
  • Einzelbyte signiert int DT_I1
  • Vier Byte signiert int DT_I4
  • Zeichenfolge DT_STR

aber es war nie wichtig (was eigentlich seltsam erscheint, wenn man bedenkt, wie penibel SSIS mit Datentypen umgeht) --- meine Ausgabe war immer dieselbe

False,Falsification
True,True dat

Wenn ich letztendlich eine 0 oder eine 1 in dieser Ausgabedatei haben wollte, musste ich meinen Datentyp ändern:entweder in der Quellabfrage mit einer expliziten Umwandlung oder durch eine Derived Column-Komponente mit dem ternären Operator SomeBit ? (DT_I1)1 : (DT_I1)0 . Verwenden Sie DT_I1/I2/I4/I8 nach Belieben

Kleiner Hinweis:Wenn Sie sich für die Verwendung der Datenkonvertierungskomponente entschieden haben, erhalten Sie 0 für False, -1 für True oder wenn Sie in der Derived Component (DT_I1) SomeBit einen Lazy Cast verwenden Es scheint, dass sie der C-Interpretation von booleschen Werten folgen.

Biml es

Sie müssen sich nicht auf mein Wort verlassen. Verwenden Sie die obigen Tabellendefinitionen und Werte, wenn Sie das kostenlose Addon BIDS Helper installieren Sie können denselben Code für jede Version von SSIS generieren.

Klicken Sie nach der Installation von BIDS Helper mit der rechten Maustaste auf ein SSIS-Projekt und wählen Sie im Kontextmenü Biml-Datei hinzufügen. Ersetzen Sie den Inhalt dieser Datei durch den folgenden Code; speichern und dann mit der rechten Maustaste klicken, um ein neues Paket zu erstellen.

Sie müssen die Werte für die Flat File-Verbindung bearbeiten, um auf gültige Speicherorte zu verweisen, sowie die Ole-DB-Verbindungszeichenfolge dorthin verweisen, wo Sie Ihre Tabellen hochfahren.

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