Nguyên nhân:
SSIS không đọc được tệp và hiển thị cảnh báo bên dưới do dấu phân cách cột Ç
( "c" với cedilla ) và not
do dấu phân cách dòng {LF}
( Nguồn cấp dữ liệu dòng ).
[Read flat file [1]] Warning: The end of the data file was reached while
reading header rows. Make sure the header row delimiter and the number of
header rows to skip are correct.
Đây là gói SSIS mẫu cho biết cách giải quyết sự cố bằng cách sử dụng Script Component
và ở phần cuối, có một ví dụ khác mô phỏng sự cố của bạn.
Độ phân giải:
Gói mẫu dưới đây được viết bằng SSIS 2008 R2
. Nó đọc một tệp phẳng có dấu phân cách hàng {LF}
như một giá trị cột duy nhất; sau đó chia nhỏ dữ liệu bằng Script Component
để chèn thông tin vào bảng trong SQL Server 2008 R2
cơ sở dữ liệu.
Sử dụng Notepad ++
để tạo một tệp phẳng đơn giản với ít hàng. Tệp mẫu bên dưới có Id sản phẩm và Giá niêm yết thông tin trên mỗi hàng được phân tách bằng Ç
làm dấu phân cách cột và mỗi hàng kết thúc bằng {LF}
dấu phân cách.
Trên Notepad ++, nhấp vào Encoding
và sau đó nhấp vào Encoding in UTF-8
để lưu tệp phẳng trong UTF-8
mã hóa.
Mẫu sẽ sử dụng SQL Server 2008 R2
cơ sở dữ liệu có tên Sora
. Tạo một bảng mới có tên dbo.ProductListPrice
bằng cách sử dụng script dưới đây. SSIS sẽ chèn dữ liệu tệp phẳng vào bảng này.
USE Sora;
GO
CREATE TABLE dbo.ProductListPrice
(
ProductId nvarchar(30) NOT NULL
, ListPrice numeric(12,2) NOT NULL
);
GO
Tạo gói SSIS bằng Business Intelligence Development Studio (BIDS) 2008 R2 . Đặt tên gói là SO_6268205.dtsx
. Tạo nguồn dữ liệu có tên Sora.ds
để kết nối với cơ sở dữ liệu Sora
trong SQL Server 2008 R2 .
Nhấp chuột phải vào bất kỳ đâu bên trong gói và sau đó nhấp vào Variables
để xem ngăn biến. Tạo một biến mới có tên là ColumnDelimiter
của kiểu dữ liệu String
trong phạm vi gói SO_6268205
và đặt biến có giá trị Ç
Nhấp chuột phải vào Connection Managers
và nhấp vào New Flat File Connection...
để tạo kết nối để đọc tệp phẳng.
Trên General
trang của Trình chỉnh sửa trình quản lý kết nối tệp phẳng , thực hiện các hành động sau:
- Đặt Tên trình quản lý kết nối đến
ProductListPrice
- Đặt Mô tả đến
Flat file connection manager to read product list price information.
- Chọn đường dẫn tệp phẳng. Tôi có tệp trong đường dẫn
C:\Siva\StackOverflow\Files\6268205\ProductListPrice.txt
- Chọn
{LF}
từ Dấu phân cách hàng tiêu đề - Kiểm tra
Column names in the first data row
- Nhấp vào
Columns
trang
Trên Columns
trang của Trình chỉnh sửa trình quản lý kết nối tệp phẳng , xác minh rằng Column delimiter
trống và bị vô hiệu hóa. Nhấp vào Advanced
trang.
Trên Advanced
trang của Trình chỉnh sửa trình quản lý kết nối tệp phẳng , thực hiện các hành động sau.
- Đặt Tên tới
LineData
- Xác minh rằng Dấu phân cách cột được đặt thành
{LF}
- Đặt DataType thành
Unicode string [DT_WSTR]
- Đặt OutputColumnWidth thành
255
- Nhấp vào
Preview
trang.
Trên Preview
trang của Trình chỉnh sửa trình quản lý kết nối tệp phẳng , xác minh rằng dữ liệu được hiển thị có vẻ chính xác và nhấp vào OK
.
Bạn sẽ thấy nguồn dữ liệu Sora và trình quản lý kết nối tệp phẳng ProductListPrice trên Connection Managers
ở cuối gói.
Kéo và thả Data Flow Task
vào Quy trình kiểm soát của gói và đặt tên là File to database - Without Cedilla delimiter
Nhấp đúp vào Nhiệm vụ luồng dữ liệu để chuyển chế độ xem sang Data Flow
trên gói. Kéo và thả Flat File Source
trên Luồng dữ liệu chuyển hướng. Nhấp đúp vào Nguồn tệp phẳng để mở Flat File Source Editor
.
Trên Connection Managers
trang của Trình chỉnh sửa nguồn tệp phẳng , chọn Trình quản lý kết nối tệp phẳng ProductListPrice
và nhấp vào Cột trang.
Trên Columns
trang của Trình chỉnh sửa nguồn tệp phẳng , kiểm tra cột LineData
và nhấp vào OK
.
Kéo và thả Script Component
vào Luồng dữ liệu bên dưới tab Nguồn tệp phẳng , chọn Transformation
và nhấp vào OK
. Kết nối mũi tên màu xanh lục từ Nguồn tệp phẳng thành Thành phần tập lệnh . Nhấp đúp vào Thành phần tập lệnh để mở Script Transformation Editor
.
Nhấp vào Cột đầu vào trên Trình chỉnh sửa chuyển đổi tập lệnh và chọn LineData
cột. Nhấp vào Đầu vào và đầu ra trang.
Trên Inputs and Outputs
trang của Trình chỉnh sửa chuyển đổi tập lệnh , thực hiện các hành động sau.
- Thay đổi tên đầu vào thành FlatFileInput
- Thay đổi tên kết quả đầu ra thành
SplitDataOutput
- Chọn Cột đầu ra và nhấp vào
Add Column
. Lặp lại điều này một lần nữa để thêm một cột khác. - Đặt tên cho cột đầu tiên là
ProductId
- Đặt DataType của cột ProductId thành
Unicode string [DT_WSTR]
- Đặt Độ dài thành
30
Trên Inputs and Outputs
trang của Trình chỉnh sửa chuyển đổi tập lệnh , thực hiện các hành động sau.
- Đặt tên cho cột thứ hai là
ListPrice
- Đặt DataType của cột ListPrice thành
numeric [DT_NUMERIC]
- Đặt Độ chính xác thành
12
- Đặt Tỷ lệ thành
2
- Nhấp vào Tập lệnh trang để sửa đổi tập lệnh
Trên Script
trang của Trình chỉnh sửa chuyển đổi tập lệnh , thực hiện các hành động sau.
- Nhấp vào nút dấu chấm lửng trên ReadOnlyVariables và chọn biến
User::ColumnDelimiter
- Nhấp vào
Edit Script...
Dán C # bên dưới vào Trình chỉnh sửa tập lệnh. Tập lệnh thực hiện các tác vụ sau.
- Sử dụng giá trị dấu phân cách cột
Ç
được xác định trong biến Người dùng ::ColumnDelimiter , phương thứcFlatFileInput_ProcessInputRow
tách giá trị đến và gán giá trị đó cho hai cột đầu ra được xác định trong phép chuyển đổi Thành phần tập lệnh.
Mã thành phần tập lệnh trong C #
using System;
using System.Data;
using Microsoft.SqlServer.Dts.Pipeline.Wrapper;
using Microsoft.SqlServer.Dts.Runtime.Wrapper;
[Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute]
public class ScriptMain : UserComponent
{
public override void PreExecute()
{
base.PreExecute();
}
public override void PostExecute()
{
base.PostExecute();
}
public override void FlatFileInput_ProcessInputRow(FlatFileInputBuffer Row)
{
const int COL_PRODUCT = 0;
const int COL_PRICE = 1;
char delimiter = Convert.ToChar(this.Variables.ColumnDelimiter);
string[] lineData = Row.LineData.ToString().Split(delimiter);
Row.ProductId = String.IsNullOrEmpty(lineData[COL_PRODUCT])
? String.Empty
: lineData[COL_PRODUCT];
Row.ListPrice = String.IsNullOrEmpty(lineData[COL_PRICE])
? 0
: Convert.ToDecimal(lineData[COL_PRICE]);
}
}
Kéo và thả OLE DB Destination
vào Luồng dữ liệu chuyển hướng. Kết nối mũi tên màu xanh lục từ Thành phần tập lệnh đến OLE DB Destination . Nhấp đúp vào Đích đến của OLE DB để mở OLE DB Destination Editor
.
Trên Connection Managers
trang của OLE DB Destination Editor , thực hiện các hành động sau.
- Chọn
Sora
từ Trình quản lý kết nối OLE DB - Chọn
Table or view - fast load
từ Chế độ truy cập dữ liệu - Chọn
[dbo].[ProductListPrice]
từ Tên của bảng hoặc chế độ xem - Nhấp vào Ánh xạ trang
Nhấp vào Mappings
trên trang OLE DB Destination Editor sẽ tự động ánh xạ các cột nếu tên cột đầu vào và đầu ra giống nhau. Nhấp vào OK
.
Luồng dữ liệu tab sẽ trông giống như thế này sau khi định cấu hình tất cả các thành phần.
Thực thi truy vấn select * from dbo.ProductListPrice
trong SQL Server Management Studio (SSMS) để tìm số hàng trong bảng. Nó phải trống trước khi thực thi gói.
Thực hiện gói. Bạn sẽ nhận thấy rằng gói được xử lý thành công 9 hàng. Tệp phẳng chứa 10 nhưng hàng đầu tiên là tiêu đề với tên cột.
Thực thi truy vấn select * from dbo.ProductListPrice
trong SQL Server Management Studio (SSMS) để tìm 9 hàng đã được chèn thành công vào bảng. Dữ liệu phải khớp với dữ liệu tệp phẳng.
Ví dụ trên minh họa cách phân chia dữ liệu theo cách thủ công bằng Thành phần tập lệnh bởi vì Trình quản lý kết nối tệp phẳng gặp lỗi khi định cấu hình dấu phân tách cột Ç
Mô phỏng vấn đề:
Ví dụ này hiển thị một Trình quản lý kết nối tệp phẳng riêng biệt được định cấu hình bằng dấu phân cách cột Ç
, thực thi nhưng gặp cảnh báo và không xử lý bất kỳ dòng nào.
Nhấp chuột phải vào Connection Managers
và nhấp vào New Flat File Connection...
để tạo kết nối để đọc tệp phẳng. Trên General
trang của Trình chỉnh sửa trình quản lý kết nối tệp phẳng , thực hiện các hành động sau:
- Đặt Tên trình quản lý kết nối tới
ProductListPrice_Cedilla
- Đặt Mô tả thành
Flat file connection manager with Cedilla column delimiter.
- Tôi có tệp trong đường dẫn
C:\Siva\StackOverflow\Files\6268205\ProductListPrice.txt
Chọn đường dẫn tệp phẳng. - Chọn
{LF}
từ Dấu phân cách hàng tiêu đề - Kiểm tra
Column names in the first data row
- Nhấp vào
Columns
trang
Trên Columns
trang của Trình chỉnh sửa trình quản lý kết nối tệp phẳng , thực hiện các hành động sau:
- Đặt Dấu phân cách hàng tới
{LF}
- Trường dấu phân cách cột có thể bị tắt. Nhấp vào
Reset Columns
- Đặt Dấu phân cách cột thành
Ç
- Nhấp vào
Advanced
trang
Trên Advanced
trang của Trình chỉnh sửa trình quản lý kết nối tệp phẳng , thực hiện các hành động sau:
- Đặt Tên tới
ProductId
- Đặt ColumnDelimiter thành
Ç
- Đặt DataType thành
Unicode string [DT_WSTR]
- Đặt Độ dài thành
30
- Nhấp vào cột
ListPrice
Trên Advanced
trang của Trình chỉnh sửa trình quản lý kết nối tệp phẳng , thực hiện các hành động sau:
- Đặt Tên đến
ListPrice
- Đặt ColumnDelimiter tới
{LF}
- Đặt DataType thành
numeric [DT_NUMERIC]
- Đặt Dữ liệu chính xác thành
12
- Đặt DataScale thành
2
- Nhấp vào
OK
Kéo và thả Data Flow task
vào Quy trình kiểm soát tab và đặt tên là File to database - With Cedilla delimiter
. Tắt tác vụ luồng dữ liệu đầu tiên.
Định cấu hình tác vụ luồng dữ liệu thứ hai với Flat File Source
và OLE DB Destination
Nhấp đúp vào Nguồn tệp phẳng để mở Flat File Source Editor
. Trên Connection Managers
trang của Trình chỉnh sửa nguồn tệp phẳng , chọn Trình quản lý kết nối tệp phẳng ProductListPrice_Cedilla
và nhấp vào Cột trang để định cấu hình các cột. Nhấp vào OK
.
Thực hiện gói. Tất cả các thành phần sẽ hiển thị màu xanh lục để cho biết rằng quá trình đã thành công nhưng không có hàng nào được xử lý. Bạn có thể thấy rằng không có dấu hiệu số hàng giữa Flat File Source
và OLE DB Destination
Nhấp vào Progress
và bạn sẽ nhận thấy thông báo cảnh báo sau.
[Read flat file [1]] Warning: The end of the data file was reached while
reading header rows. Make sure the header row delimiter and the number of
header rows to skip are correct.