Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Tại sao SSIS không nhận ra dấu phân cách hàng {LF} của nguồn cấp dữ liệu dòng khi nhập tệp phẳng UTF-8?

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 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ức FlatFileInput_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 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 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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Không thể chèn null vào datetime trong máy chủ sql

  2. Chọn trường là Phân biệt có kiểu dữ liệu là Văn bản. Máy chủ Sql

  3. Cách chỉ định đối chiếu trong truy vấn trong SQL Server (T-SQL)

  4. SQL Server - Bảng PIVOT động - SQL Injection

  5. Chuyển đổi ‘datetime’ thành ‘datetime2’ trong SQL Server (Ví dụ T-SQL)