sql >> Database >  >> RDS >> Sqlserver

SQL Server BIT-gegevenstype rapporteert anders voor View- en Table-query

Het bitgegevenstype wordt door clients verschillend geïnterpreteerd. SSMS, rapporteert een 1 of 0 een tijdje, terwijl dezelfde 1/0 wordt geïnterpreteerd door de gegevensstroom van een SSIS als True of False .

Of de bron een tabel of een weergave is, maakt voor SSIS niet uit, tenzij u het gegevenstype expliciet wijzigt.

Voor de installatie heb ik 2 tabellen en een weergave gemaakt

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

Op dit moment, als ik SSMS gebruik en een query doe op dbo.BaseTable of dbo.MyView, krijg ik een 1 en een 0 terug. Maar nogmaals, dit zijn slechts artefacten van de presentatie. In C is 0 onwaar en elke numerieke waarde die niet 0 is, is waar. Excel zal het presenteren als ONWAAR en WAAR. Elke klant zal de waarde interpreteren in wat de lokale representatie van een booleaanse waarde ook is. SSIS koos voor Waar en Niet waar.

Ik heb een eenvoudig pakket gebouwd dat gegevens uit BaseTable of MyView haalt en deze naar een tekstbestand en een tabel schrijft.

De basisregelstroom ziet er zo uit

De gegevensstroom ziet er ingewikkeld uit, maar is het niet.

Ik maak een keuze uit mijn tabel of weergave, voeg een beschrijving toe voor mijn doeltabel, gebruik een multicast zodat ik dezelfde gegevens naar meerdere bestemmingen kan sturen en schrijf dan naar een bestand en tabel.

Als ik SSMS opvraag voor mijn bronnen en bestemmingen, zul je zien dat de doelbibliotheken de vertaling afhandelen tussen de lokale en buitenlandse representatie van het gegevenstype.

Er is geen dergelijke vertaling beschikbaar voor een plat bestand omdat er geen "standaard" is voor de weergave van een boolean. Misschien vind ik J/N leuk. Toch is de

Ik heb een aantal dingen geprobeerd om een ​​1/0 te dwingen naar het platte bestand te schrijven. Ik heb mijn gegevenstypen ingesteld op

  • Boolean DT_BOOL
  • Enkelbyte ondertekend int DT_I1
  • Vier byte ondertekend int DT_I4
  • String DT_STR

maar het deed er nooit toe (wat eigenlijk vreemd lijkt gezien de hardnekkigheid van SSIS over datatypes) --- mijn output was altijd hetzelfde

False,Falsification
True,True dat

Als ik uiteindelijk een 0 of een 1 in dat uitvoerbestand wilde, moest ik mijn gegevenstype wijzigen:ofwel in de bronquery met een expliciete cast of via een afgeleide kolomcomponent met behulp van de ternaire operator SomeBit ? (DT_I1)1 : (DT_I1)0 . Gebruik DT_I1/I2/I4/I8 naar eigen inzicht

Leuke trivia-opmerking:als je ervoor kiest om de component Gegevensconversie te gebruiken, krijg je 0 voor False, -1 voor True of als je een luie cast gebruikt in de afgeleide component (DT_I1) SomeBit Het lijkt erop dat ze de C-interpretatie van booleaanse waarden volgen.

Biml het

Je hoeft me niet op mijn woord te geloven. Gebruikmakend van de bovenstaande tabeldefinities en populatie van waarden, als u de gratis add-on BIDS Helper installeert u kunt dezelfde code genereren voor elke versie van SSIS.

Klik na het installeren van BIDS Helper met de rechtermuisknop op een SSIS-project en selecteer in het contextmenu Biml-bestand toevoegen. Vervang de inhoud van dat bestand door de onderstaande code; opslaan en klik vervolgens met de rechtermuisknop om een ​​nieuw pakket te genereren.

U moet de waarden voor de Flat File Connection bewerken om naar geldige locaties te verwijzen, evenals de ole db-verbindingsreeks naar waar u uw tabellen ook laat draaien.

<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. Query's herschrijven om de prestaties te verbeteren

  2. Rijen splitsen in kolommen in orakel

  3. SQL Server:hoe een vast aantal rijen te selecteren (selecteer elke x-de waarde)

  4. Unieke kolomnamen selecteren uit een lijst met samengevoegde tabellen