sql >> Databasteknik >  >> RDS >> Sqlserver

SQL Server BIT-datatyp rapporterar olika för vy- och tabellfråga

Bitdatatypen tolkas olika av klienter. SSMS, kommer att rapportera tillbaka en 1 eller 0 ett tag medan samma 1/0 tolkas av en SSIS:s dataflöde som True eller False .

Om källan är en tabell eller en vy spelar ingen roll för SSIS om du inte uttryckligen ändrar datatypen.

För installation skapade jag 2 tabeller och en vy

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

Vid det här laget, om jag använder SSMS och frågar antingen dbo.BaseTable eller dbo.MyView, kommer jag att få tillbaka en 1 och 0. Men återigen, dessa är bara artefakter av presentation. I C är 0 falskt och alla numeriska värden som inte är 0 är sanna. Excel kommer att presentera det som FALSKT och SANT. Varje klient kommer att tolka värdet till vad den lokala representationen av ett booleskt värde än är. SSIS valde True and False.

Jag byggde ut ett enkelt paket som hämtar data från BaseTable eller MyView och skriver det till en textfil och en tabell.

Det grundläggande kontrollflödet ser ut så här

Dataflödet ser komplext ut men det är det inte.

Jag väljer antingen från min tabell eller vy, lägger till en beskrivning för min måltabell, använder en multicast så att jag kan skicka samma data till flera destinationer och sedan skriva till en fil och tabell.

Om jag frågar efter SSMS för mina källor och destinationer ser du att destinationsbiblioteken hanterar översättningen mellan den lokala och utländska representationen av datatypen.

Det finns ingen sådan översättning tillgänglig för en platt fil eftersom det inte finns någon "standard" för representationen av ett booleskt värde. Jag kanske gillar Y/N. Trots det,

Jag försökte ett antal saker för att tvinga en 1/0 att skrivas till den platta filen. Jag ställer in mina datatyper på

  • Boolesk DT_BOOL
  • Enskild byte signerad int DT_I1
  • Fyra byte signerade int DT_I4
  • Sträng DT_STR

men det spelade aldrig någon roll (vilket faktiskt verkar konstigt med tanke på hur snäll SSIS är om datatyper) --- min utdata var alltid densamma

False,Falsification
True,True dat

I slutändan, om jag ville ha en 0 eller en 1 i den utdatafilen, behövde jag ändra min datatyp:antingen i källfrågan med en explicit cast eller genom en härledd kolumnkomponent med den ternära operatorn SomeBit ? (DT_I1)1 : (DT_I1)0 . Använd DT_I1/I2/I4/I8 som du vill

Kul trivianotering:om du väljer att använda datakonverteringskomponenten kommer du att få 0 för False, -1 för True eller om du använder en lat cast i den härledda komponenten (DT_I1) SomeBit Det verkar som om de följer C-tolkningen av booleska värden.

Biml it

Du behöver inte ta mitt ord för det. Med hjälp av ovanstående tabelldefinitioner och värdepopulation, om du installerar det kostnadsfria tillägget BIDS Helper du kan generera samma kod för alla versioner av SSIS.

Efter installation av BIDS Helper, högerklicka på ett SSIS-projekt och välj Lägg till Biml-fil i snabbmenyn. Ersätt innehållet i den filen med koden nedan; spara och högerklicka sedan för att skapa ett nytt paket.

Du måste redigera värdena för Flat File Connection för att peka på giltiga platser samt peka ole db-anslutningssträngen till var du än snurrar upp dina tabeller.

<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. Hur kan jag dela upp en lång, enkel SQLiteOpenHelper i flera klasser, en för varje tabell

  2. Att använda My SQL joins

  3. Viloparametriserad SQL-fråga långsamma och aktiva oracle-sessioner

  4. ändra mysql datetime till php datetime-local fungerar inte av strtotime()