Sqlserver
 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 е невярно и всяка числова стойност, която не е 0, е вярна. Excel ще го представи като FALSE и TRUE. Всеки клиент ще интерпретира стойността в каквото и да е локалното представяне на булева стойност. SSIS избра True и False.

Създадох прост пакет, който изтегля данни от BaseTable или MyView и ги записва в текстов файл и таблица.

Основният контролен поток изглежда така

Потокът от данни изглежда сложен, но не е така.

Избирам от моята таблица или изглед, добавям описание за моята целева таблица, използвам мултикаст, за да мога да изпращам същите данни до множество дестинации и след това да пиша във файл и таблица.

Ако направя запитване към SSMS за моите източници и местоназначения, ще видите, че библиотеките на местоназначението обработват превода между местното и чуждестранното представяне на типа данни.

Няма наличен такъв превод за плосък файл, защото няма "стандарт" за представяне на булево. Може да ми хареса Y/N. Въпреки това,

Опитах редица неща, за да принудя 1/0 да бъде записан в плоския файл. Зададох моите типове данни на

  • Булев DT_BOOL
  • Един байт със знак int DT_I1
  • Четири байта със знак int DT_I4
  • Низ DT_STR

но това никога не е имало значение (което всъщност изглежда странно, като се има предвид колко проницателен е SSIS относно типовете данни) --- изходът ми винаги беше един и същ

False,Falsification
True,True dat

В крайна сметка, ако исках 0 или 1 в този изходен файл, трябваше да променя типа си данни:или в изходната заявка с изрично преобразуване, или чрез компонент на производна колона, използвайки троичния оператор SomeBit ? (DT_I1)1 : (DT_I1)0 . Използвайте DT_I1/I2/I4/I8 както сметнете за добре

Забавна любопитна бележка:ако изберете да използвате компонента за преобразуване на данни, ще получите 0 за False, -1 за True или ако използвате мързеливо преобразуване в производния компонент (DT_I1) SomeBit Изглежда, че следват C интерпретацията на булевите стойности.

Направете го

Няма нужда да вярвате на думата ми. Като използвате дефинициите на таблицата по-горе и популацията от стойности, ако инсталирате безплатния аддон Помощник за BIDS можете да генерирате същия код за всяка версия на 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как мога да актуализирам моята схема на база данни на SQL Server?

  2. Как да копирате данни и таблици на база данни от една база данни в друга

  3. Съхранената процедура виси привидно без обяснение

  4. sql първичен ключ и индекс

  5. Има ли LastIndexOf в SQL Server?