Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

O tipo de dados BIT do SQL Server relata de forma diferente para consulta de exibição e tabela


O tipo de dados bit é interpretado pelos clientes de forma diferente. SSMS, reportará um 1 ou 0 por um bit enquanto o mesmo 1/0 é interpretado pelo fluxo de dados de um SSIS como True ou False .

Se a origem é uma tabela ou uma exibição não importa para o SSIS, a menos que você altere explicitamente o tipo de dados.

Para configuração, criei 2 tabelas e uma view
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

Neste ponto, se eu usar o SSMS e consultar dbo.BaseTable ou dbo.MyView, obterei de volta um 1 e 0. Mas, novamente, esses são apenas artefatos de apresentação. Em C, 0 é falso e qualquer valor numérico que não seja 0 é verdadeiro. O Excel irá apresentá-lo como FALSE e TRUE. Cada cliente interpretará o valor em qualquer que seja a representação local de um valor booleano. O SSIS escolheu Verdadeiro e Falso.

Eu construí um pacote simples que extrai dados de BaseTable ou MyView e os grava em um arquivo de texto e uma tabela.

O fluxo de controle básico fica assim



O fluxo de dados parece complexo, mas não é.



Eu seleciono da minha tabela ou visualização, adiciono uma descrição para minha tabela de destino, uso um multicast para que eu possa enviar os mesmos dados para vários destinos e, em seguida, gravar em um arquivo e tabela.

Se eu consultar o SSMS para minhas origens e destinos, você verá que as bibliotecas de destino tratam da tradução entre a representação local e estrangeira do tipo de dados.



Não existe tal tradução disponível para um arquivo simples porque não existe um "padrão" para a representação de um booleano. Eu poderia gostar de S/N. Mesmo assim, o

Eu tentei várias coisas para forçar um 1/0 a ser gravado no arquivo simples. Eu defino meus tipos de dados para


  • Booleano DT_BOOL
  • Byte único assinado em DT_I1
  • Quatro bytes assinados em DT_I4
  • String DT_STR

mas isso nunca importou (o que realmente parece estranho, dado o quão perspicaz o SSIS é sobre tipos de dados) --- minha saída sempre foi a mesma
False,Falsification
True,True dat

Por fim, se eu quisesse um 0 ou um 1 nesse arquivo de saída, precisava alterar meu tipo de dados:na consulta de origem com uma conversão explícita ou por meio de um componente Derived Column usando o operador ternário SomeBit ? (DT_I1)1 : (DT_I1)0 . Use DT_I1/I2/I4/I8 como achar melhor

Nota de curiosidade divertida:se você optar por usar o componente Data Conversion, obterá 0 para False, -1 para True ou se usar uma conversão lenta no componente derivado (DT_I1) SomeBit Parece que eles seguem a interpretação C de valores booleanos.

Faça isso


Não há necessidade de aceitar minha palavra. Usando as definições da tabela acima e a população de valores, se você instalar o complemento gratuito BIDS Helper você pode gerar o mesmo código para qualquer versão do SSIS.

Após instalar o BIDS Helper, clique com o botão direito do mouse em um projeto SSIS e, no menu de contexto, selecione Adicionar arquivo Biml. Substitua o conteúdo desse arquivo pelo código abaixo; salve e clique com o botão direito do mouse para gerar um novo pacote.

Você precisará editar os valores para a Conexão de Arquivo Simples para apontar para locais válidos, bem como apontar a cadeia de conexão ole db para onde quer que você gire suas tabelas.
<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>