sql >> データベース >  >> RDS >> Sqlserver

SQL Server の BIT データ型のレポートが、ビューとテーブルのクエリで異なる

    ビット データ型は、クライアントによって異なる方法で解釈されます。 SSMS は 1 を返します または 0 少しの間、同じ 1/0 が SSIS のデータ フローによって True として解釈されます。 または False .

    データ型を明示的に変更しない限り、ソースがテーブルであるかビューであるかは SSIS にとって重要ではありません。

    セットアップのために、2 つのテーブルとビューを作成しました

    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
      

    この時点で、SSMS を使用して dbo.BaseTable または dbo.MyView をクエリすると、1 と 0 が返されます。 C では、0 は false であり、0 以外の数値はすべて true です。 Excel はそれを FALSE および TRUE として表示します。すべてのクライアントは、ブール値のローカル表現が何であれ、値を解釈します。 SSIS は True と False を選択しました。

    BaseTable または MyView からデータを取得し、テキスト ファイルとテーブルに書き込む単純なパッケージを作成しました。

    基本的な制御フローはこのようになります

    データ フローは複雑に見えますが、そうではありません。

    テーブルまたはビューから選択し、ターゲット テーブルの説明を追加し、マルチキャストを使用して同じデータを複数の宛先に送信し、ファイルとテーブルに書き込むことができます。

    ソースと宛先について SSMS を照会すると、宛先ライブラリがデータ型のローカル表現と外部表現の間の変換を処理することがわかります。

    ブール値の表現には「標準」がないため、フラット ファイルに使用できるそのような変換はありません。 Y/Nが好きかも。それでも、

    1/0 を強制的にフラット ファイルに書き込むために、さまざまなことを試しました。データ型を

    に設定しました

    • ブール値 DT_BOOL
    • 1 バイトの符号付き int DT_I1
    • 4 バイトの符号付き整数 DT_I4
    • 文字列 DT_STR

    しかし、それは問題ではありませんでした (SSIS がデータ型に関していかに厄介であるかを考えると、実際には奇妙に思えます) --- 私の出力は常に同じでした

    False,Falsification
    True,True dat
      

    最終的に、その出力ファイルに 0 または 1 が必要な場合は、データ型を変更する必要がありました。ソース クエリで明示的なキャストを使用するか、派生列コンポーネントを使用して三項演算子 SomeBit ? (DT_I1)1 : (DT_I1)0 .必要に応じて DT_I1/I2/I4/I8 を使用してください

    豆知識:データ変換コンポーネントの使用を選択した場合、False の場合は 0、True の場合は -1 を取得するか、派生コンポーネント (DT_I1) SomeBit で遅延キャストを使用する場合 ブール値の C 解釈に従っているようです。

    ビムル

    私の言葉を鵜呑みにする必要はありません。無料のアドオン BIDS Helper をインストールする場合、上記の表の定義と値の母集団を使用します。 どのバージョンの SSIS でも同じコードを生成できます。

    BIDS Helper をインストールした後、SSIS プロジェクトを右クリックし、コンテキスト メニューで [Biml ファイルの追加] を選択します。そのファイルの内容を以下のコードに置き換えます。保存してから右クリックして、新しいパッケージを生成します。

    フラット ファイル接続の値を編集して、有効な場所を指すようにし、ole db 接続文字列がテーブルをスピンアップする場所を指すようにする必要があります。

    <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. ミドルウェアのLaravelオーダー(ミドルウェア優先)。 Postgresを使用したマルチテナント

    2. 1ページで多くのクエリを実行するにはどうすればよいですか?

    3. エラー:エラー1005:テーブルを作成できません(errno:121)

    4. postgresql.serviceを開始できませんか?