sql >> Base de Datos >  >> RDS >> Sqlserver

El tipo de datos BIT de SQL Server informa de manera diferente para la consulta de vista y tabla

Los clientes interpretan el tipo de datos de bit de manera diferente. SSMS, informará un 1 o 0 por un momento mientras el flujo de datos de un SSIS interpreta el mismo 1/0 como True o False .

Si la fuente es una tabla o una vista, no importa para SSIS, a menos que cambie explícitamente el tipo de datos.

Para la configuración, creé 2 tablas y una vista

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

En este punto, si uso SSMS y consulto dbo.BaseTable o dbo.MyView, obtendré un 1 y un 0. Pero nuevamente, estos son solo artefactos de presentación. En C, 0 es falso y cualquier valor numérico que no sea 0 es verdadero. Excel lo presentará como FALSO y VERDADERO. Cada cliente interpretará el valor en cualquiera que sea la representación local de un valor booleano. SSIS eligió Verdadero y Falso.

Desarrollé un paquete simple que extrae datos de BaseTable o MyView y los escribe en un archivo de texto y una tabla.

El flujo de control básico se ve así

El flujo de datos parece complejo pero no lo es.

Selecciono desde mi tabla o vista, agrego una descripción para mi tabla de destino, uso una multidifusión para poder enviar los mismos datos a múltiples destinos y luego escribir en un archivo y una tabla.

Si consulto SSMS para mis fuentes y destinos, verá que las bibliotecas de destino manejan la traducción entre la representación local y extranjera del tipo de datos.

No existe tal traducción disponible para un archivo plano porque no existe un "estándar" para la representación de un booleano. Me puede gustar T/N. Aun así, el

Intenté varias cosas para obligar a que se escribiera un 1/0 en el archivo plano. Establecí mis tipos de datos en

  • Booleano DT_BOOL
  • Byte único firmado int DT_I1
  • 4 bytes firmados ent DT_I4
  • Cadena DT_STR

pero nunca importó (lo que en realidad parece extraño dado lo quisquilloso que es SSIS con los tipos de datos) --- mi salida siempre fue la misma

False,Falsification
True,True dat

En última instancia, si quería un 0 o un 1 en ese archivo de salida, necesitaba cambiar mi tipo de datos:ya sea en la consulta de origen con una conversión explícita o a través de un componente de columna derivada usando el operador ternario SomeBit ? (DT_I1)1 : (DT_I1)0 . Utilice DT_I1/I2/I4/I8 como mejor le parezca

Nota de trivia divertida:si elige usar el componente de conversión de datos, obtendrá 0 para falso, -1 para verdadero o si usa una conversión perezosa en el componente derivado (DT_I1) SomeBit Parece que siguen la interpretación de C de los valores booleanos.

Biml it

No hay necesidad de creer en mi palabra. Usando las definiciones de la tabla anterior y la población de valores, si instala el complemento gratuito BIDS Helper puede generar el mismo código para cualquier versión de SSIS.

Después de instalar BIDS Helper, haga clic con el botón derecho en un proyecto SSIS y, en el menú contextual, seleccione Agregar archivo Biml. Reemplace el contenido de ese archivo con el siguiente código; guarde y luego haga clic derecho para generar un nuevo paquete.

Deberá editar los valores de Flat File Connection para señalar ubicaciones válidas, así como también señalar la cadena de conexión ole db a donde quiera que haga girar sus tablas.

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