Kiểu dữ liệu bit được các máy khách diễn giải khác nhau. SSMS, sẽ báo cáo lại một 1
hoặc 0
trong khi 1/0 giống nhau được Luồng dữ liệu của SSIS diễn giải là True
hoặc False
.
Cho dù nguồn là một bảng hay một chế độ xem đều không thành vấn đề đối với SSIS trừ khi bạn thay đổi rõ ràng loại dữ liệu.
Để thiết lập, tôi đã tạo 2 bảng và một chế độ xem
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
Tại thời điểm này, nếu tôi sử dụng SSMS và truy vấn dbo.BaseTable hoặc dbo.MyView, tôi sẽ nhận lại 1 và 0. Nhưng một lần nữa, đây chỉ là những tạo tác của bản trình bày. Trong C, 0 là sai và bất kỳ giá trị số nào không phải là 0 đều đúng. Excel sẽ hiển thị nó là FALSE và TRUE. Mọi ứng dụng khách sẽ diễn giải giá trị thành bất kỳ hình thức biểu diễn cục bộ nào của giá trị boolean. SSIS đã chọn Đúng và Sai.
Tôi đã tạo ra một gói đơn giản để kéo dữ liệu từ BaseTable hoặc MyView và ghi nó vào tệp văn bản và bảng.
Luồng điều khiển cơ bản trông như vậy
Luồng dữ liệu trông có vẻ phức tạp nhưng không phải vậy.
Tôi chọn từ bảng hoặc chế độ xem của mình, thêm mô tả cho bảng mục tiêu của mình, sử dụng đa hướng để tôi có thể gửi cùng một dữ liệu đến nhiều đích và sau đó ghi vào một tệp và bảng.
Nếu tôi truy vấn SSMS cho các nguồn và đích của mình, bạn sẽ thấy rằng các thư viện đích xử lý bản dịch giữa biểu diễn địa phương và ngoại lai của kiểu dữ liệu.
Không có bản dịch như vậy cho một tệp phẳng vì không có "tiêu chuẩn" nào để biểu diễn boolean. Tôi có thể thích Y / N. Mặc dù vậy,
Tôi đã thử một số cách để ép buộc 1/0 được ghi vào tệp phẳng. Tôi đặt các loại dữ liệu của mình thành
- Boolean DT_BOOL
- Một byte được ký int DT_I1
- Bốn byte được ký int DT_I4
- Chuỗi DT_STR
nhưng nó không bao giờ quan trọng (điều này thực sự có vẻ kỳ lạ với cách SSIS thông minh về kiểu dữ liệu) --- kết quả đầu ra của tôi luôn giống nhau
False,Falsification
True,True dat
Cuối cùng, nếu tôi muốn có số 0 hoặc số 1 trong tệp đầu ra đó, tôi cần phải thay đổi kiểu dữ liệu của mình:trong truy vấn nguồn với một kiểu truyền rõ ràng hoặc thông qua thành phần Cột Xuất phát bằng cách sử dụng toán tử bậc ba SomeBit ? (DT_I1)1 : (DT_I1)0
. Sử dụng DT_I1 / I2 / I4 / I8 khi bạn thấy phù hợp
Lưu ý câu đố vui:nếu bạn chọn sử dụng thành phần Chuyển đổi dữ liệu, bạn sẽ nhận được 0 cho Sai, -1 cho Đúng hoặc nếu bạn sử dụng truyền chậm trong Thành phần bắt nguồn (DT_I1) SomeBit
Có vẻ như họ tuân theo cách diễn giải C của các giá trị boolean.
Biml nó
Không cần phải lấy lời của tôi cho nó. Sử dụng các định nghĩa bảng ở trên và tập hợp các giá trị, nếu bạn cài đặt addon miễn phí BIDS Helper bạn có thể tạo cùng một mã cho bất kỳ phiên bản SSIS nào.
Sau khi cài đặt BIDS Helper, nhấp chuột phải vào một dự án SSIS và trong menu ngữ cảnh, chọn Thêm tệp Biml. Thay thế nội dung của tệp đó bằng mã bên dưới; lưu và sau đó nhấp chuột phải để tạo một gói mới.
Bạn sẽ cần phải chỉnh sửa các giá trị cho Kết nối tệp phẳng để trỏ đến các vị trí hợp lệ cũng như trỏ chuỗi kết nối ole db tới bất cứ nơi nào bạn xoay các bảng của mình.
<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>