Типът битови данни се интерпретира от клиентите по различен начин. 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>