sql >> Databáze >  >> RDS >> Sqlserver

Typ dat SQL Server BIT sestavy odlišně pro dotaz zobrazení a tabulky

Bitový datový typ je klienty interpretován odlišně. SSMS, ohlásí 1 nebo 0 na chvíli je stejná 1/0 interpretována datovým tokem SSIS jako True nebo False .

Pro SSIS nezáleží na tom, zda je zdrojem tabulka nebo pohled, pokud výslovně nezměníte datový typ.

Pro nastavení jsem vytvořil 2 tabulky a pohled

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

V tomto okamžiku, pokud použiji SSMS a dotazuji se buď dbo.BaseTable nebo dbo.MyView, dostanu zpět 1 a 0. Ale opět, toto jsou jen artefakty prezentace. V C je 0 nepravda a jakákoli číselná hodnota, která není 0, je pravdivá. Excel to bude prezentovat jako NEPRAVDA a PRAVDA. Každý klient bude interpretovat hodnotu do jakékoli lokální reprezentace booleovské hodnoty. SSIS zvolil True and False.

Vytvořil jsem jednoduchý balíček, který stahuje data z BaseTable nebo MyView a zapisuje je do textového souboru a tabulky.

Základní řídicí tok vypadá takto

Datový tok vypadá složitě, ale není.

Vybírám ze své tabulky nebo zobrazení, přidávám popis pro svou cílovou tabulku, používám vícesměrové vysílání, abych mohl posílat stejná data do více cílů a poté zapisovat do souboru a tabulky.

Pokud se dotazuji SSMS na své zdroje a cíle, uvidíte, že cílové knihovny zpracovávají překlad mezi místní a zahraniční reprezentací datového typu.

Pro plochý soubor není k dispozici žádný takový překlad, protože neexistuje žádný "standard" pro reprezentaci booleanu. Mohl bych mít rád Y/N. I tak je

Zkoušel jsem řadu věcí, jak vynutit, aby 1/0 byla zapsána do plochého souboru. Nastavil jsem své datové typy na

  • Booleovský DT_BOOL
  • Jeden bajt podepsaný int DT_I1
  • Čtyři bajty podepsané int DT_I4
  • Řetězec DT_STR

ale nikdy na tom nezáleželo (což ve skutečnosti vypadá divně vzhledem k tomu, jak persnickety SSIS je o datových typech) --- můj výstup byl vždy stejný

False,Falsification
True,True dat

Nakonec, pokud jsem chtěl v tomto výstupním souboru 0 nebo 1, musel jsem změnit svůj datový typ:buď ve zdrojovém dotazu s explicitním přetypováním, nebo prostřednictvím komponenty Odvozený sloupec pomocí ternárního operátoru SomeBit ? (DT_I1)1 : (DT_I1)0 . Použijte DT_I1/I2/I4/I8, jak uznáte za vhodné

Zábavná drobná poznámka:pokud se rozhodnete použít komponentu Data Conversion, dostanete 0 pro False, -1 pro True nebo pokud použijete líné obsazení v odvozené komponentě (DT_I1) SomeBit Zdá se, že se řídí C interpretací booleovských hodnot.

Biml to

Není třeba mě brát za slovo. Pomocí výše uvedených definic tabulek a populace hodnot, pokud si nainstalujete bezplatný doplněk Pomocník nabídek můžete vygenerovat stejný kód pro jakoukoli verzi SSIS.

Po instalaci BIDS Helper klikněte pravým tlačítkem na projekt SSIS a v kontextové nabídce vyberte Přidat soubor Biml. Nahraďte obsah tohoto souboru níže uvedeným kódem; uložit a poté kliknutím pravým tlačítkem vygenerovat nový balíček.

Budete muset upravit hodnoty pro připojení s plochým souborem tak, aby ukazovaly na platná umístění, a také nasměrovat připojovací řetězec ole db na místo, kde roztáčíte své tabulky.

<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. CakePHP 3 - Ukládání dat s asociacemi, kde závisí na asociaci

  2. PHP Vyberte z MySQL, kde datum je 7 dní v budoucnosti

  3. Jak používat listagg s querydsl?

  4. <SQL>Jak změnit velikost VARCHAR2 tabulky