Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Le type de données SQL Server BIT rapporte différemment pour les requêtes de vue et de table

Le type de données bit est interprété différemment par les clients. SSMS, renverra un 1 ou 0 pendant un moment alors que le même 1/0 est interprété par le flux de données d'un SSIS comme True ou False .

Que la source soit une table ou une vue importe peu pour SSIS, sauf si vous modifiez explicitement le type de données.

Pour la configuration, j'ai créé 2 tables et une vue

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

À ce stade, si j'utilise SSMS et que j'interroge dbo.BaseTable ou dbo.MyView, je récupère un 1 et un 0. Mais encore une fois, ce ne sont que des artefacts de présentation. En C, 0 est faux et toute valeur numérique autre que 0 est vraie. Excel le présentera comme FAUX et VRAI. Chaque client interprétera la valeur quelle que soit la représentation locale d'une valeur booléenne. SSIS a choisi Vrai et Faux.

J'ai créé un package simple qui extrait les données de BaseTable ou MyView et les écrit dans un fichier texte et une table.

Le flux de contrôle de base ressemble à ceci

Le flux de données semble complexe mais ce n'est pas le cas.

Je sélectionne à partir de ma table ou de ma vue, j'ajoute une description pour ma table cible, j'utilise une multidiffusion afin de pouvoir envoyer les mêmes données à plusieurs destinations, puis j'écris dans un fichier et une table.

Si j'interroge SSMS pour mes sources et destinations, vous verrez que les bibliothèques de destination gèrent la traduction entre la représentation locale et étrangère du type de données.

Une telle traduction n'est pas disponible pour un fichier plat car il n'y a pas de "standard" pour la représentation d'un booléen. Je pourrais aimer O/N. Même ainsi, le

J'ai essayé un certain nombre de choses pour contraindre un 1/0 à être écrit dans le fichier plat. J'ai défini mes types de données sur

  • Booléen DT_BOOL
  • Octet simple signé int DT_I1
  • Quatre octets signés int DT_I4
  • Chaîne DT_STR

mais cela n'a jamais eu d'importance (ce qui semble en fait étrange compte tenu de la perspicacité de SSIS sur les types de données) --- ma sortie était toujours la même

False,Falsification
True,True dat

En fin de compte, si je voulais un 0 ou un 1 dans ce fichier de sortie, je devais changer mon type de données :soit dans la requête source avec un cast explicite, soit via un composant Derived Column à l'aide de l'opérateur ternaire SomeBit ? (DT_I1)1 : (DT_I1)0 . Utilisez DT_I1/I2/I4/I8 comme bon vous semble

Remarque amusante :si vous choisissez d'utiliser le composant de conversion de données, vous obtiendrez 0 pour Faux, -1 pour Vrai ou si vous utilisez un cast paresseux dans le composant dérivé (DT_I1) SomeBit Il semble qu'ils suivent l'interprétation C des valeurs booléennes.

Bimlez-le

Pas besoin de me croire sur parole. En utilisant les définitions du tableau ci-dessus et la population de valeurs, si vous installez l'addon gratuit BIDS Helper vous pouvez générer le même code pour n'importe quelle version de SSIS.

Après avoir installé BIDS Helper, faites un clic droit sur un projet SSIS et dans le menu contextuel, sélectionnez Ajouter un fichier Biml. Remplacez le contenu de ce fichier par le code ci-dessous ; enregistrez puis faites un clic droit pour générer un nouveau package.

Vous devrez modifier les valeurs de la connexion de fichier plat pour pointer vers des emplacements valides ainsi que pointer la chaîne de connexion ole db vers l'endroit où vous faites tourner vos tables.

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