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

SQL Server BIT-datatypen rapporterer forskelligt for visnings- og tabelforespørgsler

Bitdatatypen fortolkes forskelligt af klienter. SSMS, vil rapportere en 1 tilbage eller 0 i et stykke tid, mens den samme 1/0 fortolkes af en SSIS's dataflow som True eller False .

Om kilden er en tabel eller en visning spiller ingen rolle for SSIS, medmindre du eksplicit ændrer datatypen.

Til opsætning oprettede jeg 2 tabeller og en visning

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

På dette tidspunkt, hvis jeg bruger SSMS og forespørger på enten dbo.BaseTable eller dbo.MyView, vil jeg få 1 og 0 tilbage. Men igen, disse er blot artefakter af præsentation. I C er 0 falsk, og enhver numerisk værdi, der ikke er 0, er sand. Excel vil præsentere det som FALSK og SAND. Hver klient vil fortolke værdien til, hvad end den lokale repræsentation af en boolesk værdi er. SSIS valgte True and False.

Jeg byggede en simpel pakke ud, der trækker data fra BaseTable eller MyView og skriver dem til en tekstfil og en tabel.

Det grundlæggende kontrolflow ser således ud

Datastrømmen ser kompleks ud, men det er den ikke.

Jeg vælger fra enten min tabel eller visning, tilføjer en beskrivelse til min måltabel, bruger en multicast, så jeg kan sende de samme data til flere destinationer og skriver derefter til en fil og tabel.

Hvis jeg forespørger SSMS for mine kilder og destinationer, vil du se, at destinationsbibliotekerne håndterer oversættelsen mellem den lokale og udenlandske repræsentation af datatypen.

Der er ingen sådan oversættelse tilgængelig for en flad fil, fordi der ikke er nogen "standard" for repræsentationen af ​​en boolean. Jeg kunne godt lide Y/N. Alligevel er den

Jeg prøvede en række ting for at tvinge en 1/0 til at blive skrevet til den flade fil. Jeg indstiller mine datatyper til

  • Boolesk DT_BOOL
  • Enkeltbyte signeret int DT_I1
  • Fire byte signeret int DT_I4
  • String DT_STR

men det betød aldrig noget (hvilket faktisk virker mærkeligt i betragtning af hvor snerpet SSIS er omkring datatyper) --- mit output var altid det samme

False,Falsification
True,True dat

I sidste ende, hvis jeg ville have et 0 eller et 1 i den outputfil, var jeg nødt til at ændre min datatype:enten i kildeforespørgslen med en eksplicit cast eller gennem en afledt kolonnekomponent ved hjælp af den ternære operator SomeBit ? (DT_I1)1 : (DT_I1)0 . Brug DT_I1/I2/I4/I8 som det passer dig

Sjov trivia note:Hvis du vælger at bruge Data Conversion-komponenten, får du 0 for False, -1 for True, eller hvis du bruger en doven cast i den afledte komponent (DT_I1) SomeBit Det ser ud til, at de følger C-fortolkningen af ​​booleske værdier.

Biml it

Ingen grund til at tage mit ord for det. Ved at bruge ovenstående tabeldefinitioner og population af værdier, hvis du installerer den gratis tilføjelse BIDS Helper du kan generere den samme kode for enhver version af SSIS.

Efter installation af BIDS Helper, højreklik på et SSIS-projekt og vælg Tilføj Biml-fil i kontekstmenuen. Erstat indholdet af den fil med nedenstående kode; gem og højreklik derefter for at generere en ny pakke.

Du bliver nødt til at redigere værdierne for Flat File Connection for at pege på gyldige placeringer samt pege ole db-forbindelsesstrengen hen til, hvor end du drejer dine tabeller op.

<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. Tilføjelse af ADO.NET Entity Data Model i VS 2017, og der sker ikke noget

  2. Sådan opretter du en funktion, der ikke returnerer noget

  3. Vis rækker fra MySQL, hvor en datetime er inden for den næste time

  4. Indstil Auto Increment felt start fra 1000 i migration laravel 5.1