Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Mengapa SSIS tidak mengenali pembatas baris {LF} feed baris saat mengimpor file datar UTF-8?

Penyebab:

SSIS gagal membaca file dan menampilkan peringatan di bawah ini karena pembatas kolom Ç ("c" dengan cedilla ) dan not karena pembatas baris {LF} (Umpan Baris ).

[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.

Berikut adalah contoh paket SSIS yang menunjukkan cara mengatasi masalah menggunakan Script Component dan pada akhirnya ada contoh lain yang mensimulasikan masalah Anda.

Resolusi:

Contoh paket di bawah ini ditulis dalam SSIS 2008 R2 . Itu membaca file datar dengan pembatas baris {LF} sebagai nilai kolom tunggal; kemudian pisahkan data menggunakan Script Component untuk memasukkan informasi ke dalam tabel di SQL Server 2008 R2 basis data.

Gunakan Notepad++ untuk membuat file datar sederhana dengan beberapa baris. File contoh di bawah ini memiliki Id Produk dan Harga Jual informasi pada setiap baris dipisahkan oleh Ç sebagai pembatas kolom dan setiap baris diakhiri dengan {LF} pembatas.

Pada Notepad++, klik Encoding lalu klik Encoding in UTF-8 untuk menyimpan file datar di UTF-8 pengkodean.

Sampel akan menggunakan SQL Server 2008 R2 database bernama Sora . Buat tabel baru bernama dbo.ProductListPrice menggunakan skrip yang diberikan di bawah ini. SSIS akan memasukkan data file datar ke dalam tabel ini.

USE Sora;
GO

CREATE TABLE dbo.ProductListPrice
(
        ProductId   nvarchar(30)    NOT NULL
    ,   ListPrice   numeric(12,2)   NOT NULL
);
GO

Buat paket SSIS menggunakan Business Intelligence Development Studio (BIDS) 2008 R2 . Beri nama paket sebagai SO_6268205.dtsx . Buat sumber data bernama Sora.ds untuk terhubung ke database Sora di SQL Server 2008 R2 .

Klik kanan di mana saja di dalam paket, lalu klik Variables untuk melihat panel variabel. Buat variabel baru bernama ColumnDelimiter tipe data String dalam cakupan paket SO_6268205 dan atur variabel dengan nilai Ç

Klik kanan pada Connection Managers dan klik New Flat File Connection... untuk membuat koneksi untuk membaca file datar.

Pada General halaman Editor Pengelola Koneksi File Datar , lakukan tindakan berikut:

  • Setel Nama pengelola koneksi ke ProductListPrice
  • Setel Deskripsi ke Flat file connection manager to read product list price information.
  • Pilih jalur file datar. Saya memiliki file di jalur C:\Siva\StackOverflow\Files\6268205\ProductListPrice.txt
  • Pilih {LF} dari Pembatas Baris Header
  • Periksa Column names in the first data row
  • Klik Columns halaman

Pada Columns halaman Editor Pengelola Koneksi File Datar , pastikan Column delimiter kosong dan dinonaktifkan. Klik Advanced halaman.

Pada Advanced halaman Editor Pengelola Koneksi File Datar , lakukan tindakan berikut.

  • Setel Nama ke LineData
  • Pastikan bahwa Pembatas kolom disetel ke {LF}
  • Setel Tipe Data ke Unicode string [DT_WSTR]
  • Setel OutputColumnWidth ke 255
  • Klik Preview halaman.

Di Preview halaman Editor Pengelola Koneksi File Datar , verifikasi bahwa data yang ditampilkan terlihat benar dan klik OK .

Anda akan melihat sumber data Sora dan manajer koneksi file datar ProductListPrice di Connection Managers tab di bagian bawah paket.

Seret dan lepas Data Flow Task ke Alur Kontrol tab paket dan beri nama sebagai File to database - Without Cedilla delimiter

Klik dua kali Tugas Aliran Data untuk mengalihkan tampilan ke Data Flow tab pada paket. Seret dan lepas Flat File Source pada Alur Data tab. Klik dua kali Sumber File Datar untuk membuka Flat File Source Editor .

Di Connection Managers halaman Editor Sumber File Datar , pilih Pengelola Koneksi File Datar ProductListPrice dan klik Kolom halaman.

Pada Columns halaman Editor Sumber File Datar , centang kolom LineData dan klik OK .

Seret dan lepas Script Component ke Alur Data tab di bawah Sumber File Datar , pilih Transformation dan klik OK . Hubungkan panah hijau dari Sumber File Datar ke Komponen Skrip . Klik dua kali Komponen Skrip untuk membuka Script Transformation Editor .

Klik Masukkan Kolom di Editor Transformasi Skrip dan pilih LineData kolom. Klik Masukan dan Keluaran halaman.

Pada Inputs and Outputs halaman Editor Transformasi Skrip , lakukan tindakan berikut.

  • Ubah nama input menjadi FlatFileInput
  • Ubah nama keluaran menjadi SplitDataOutput
  • Pilih Kolom Keluaran dan klik Add Column . Ulangi ini lagi untuk menambahkan kolom lain.
  • Beri nama kolom pertama ProductId
  • Setel Tipe Data kolom ProductId ke Unicode string [DT_WSTR]
  • Setel Panjang ke 30

Pada Inputs and Outputs halaman Editor Transformasi Skrip , lakukan tindakan berikut.

  • Beri nama kolom kedua ListPrice
  • Setel Tipe Data dari kolom ListPrice ke numeric [DT_NUMERIC]
  • Setel Presisi ke 12
  • Setel Skala ke 2
  • Klik Skrip halaman untuk memodifikasi skrip

Pada Script halaman Editor Transformasi Skrip , lakukan tindakan berikut.

  • Klik tombol elipsis pada ReadOnlyVariables dan pilih variabel User::ColumnDelimiter
  • Klik Edit Script...

Rekatkan C # di bawah ini di Editor Skrip. Script melakukan tugas-tugas berikut.

  • Menggunakan nilai pembatas kolom Ç didefinisikan dalam variabel User::ColumnDelimiter , metode FlatFileInput_ProcessInputRow membagi nilai yang masuk dan menetapkannya ke dua kolom keluaran yang ditentukan dalam transformasi Komponen Skrip.

Kode komponen skrip dalam 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]);
    }
}

Seret dan lepas OLE DB Destination ke Alur Data tab. Hubungkan panah hijau dari Komponen Skrip ke Tujuan OLE DB . Klik dua kali Tujuan OLE DB untuk membuka OLE DB Destination Editor .

Di Connection Managers halaman Editor Tujuan OLE DB , lakukan tindakan berikut.

  • Pilih Sora dari OLE DB Connection Manager
  • Pilih Table or view - fast load dari Mode akses data
  • Pilih [dbo].[ProductListPrice] dari Nama tabel atau tampilan
  • Klik Pemetaan halaman

Klik Mappings halaman di Editor Tujuan OLE DB akan secara otomatis memetakan kolom jika nama kolom input dan output sama. Klik OK .

Alur Data tab akan terlihat seperti ini setelah mengonfigurasi semua komponen.

Jalankan kueri select * from dbo.ProductListPrice di SQL Server Management Studio (SSMS) untuk menemukan jumlah baris dalam tabel. Itu harus kosong sebelum mengeksekusi paket.

Jalankan paket. Anda akan melihat bahwa paket berhasil diproses 9 baris. File datar berisi 10 baris tetapi baris pertama adalah header dengan nama kolom.

Jalankan kueri select * from dbo.ProductListPrice di SQL Server Management Studio (SSMS) untuk menemukan 9 baris berhasil dimasukkan ke dalam tabel. Data harus sesuai dengan data file datar.

Contoh di atas mengilustrasikan cara membagi data secara manual menggunakan Komponen Skrip karena Pengelola Koneksi File Datar menemukan kesalahan saat mengonfigurasi pembatas kolom Ç

Simulasi Masalah:

Contoh ini menunjukkan Pengelola Koneksi File Datar separate yang terpisah dikonfigurasi dengan pembatas kolom Ç , yang dijalankan tetapi menemui peringatan dan tidak memproses baris apa pun.

Klik kanan pada Connection Managers dan klik New Flat File Connection... untuk membuat koneksi untuk membaca file datar. Pada General halaman Editor Pengelola Koneksi File Datar , lakukan tindakan berikut:

  • Setel Nama pengelola koneksi ke ProductListPrice_Cedilla
  • Setel Deskripsi ke Flat file connection manager with Cedilla column delimiter.
  • Saya memiliki file di jalur C:\Siva\StackOverflow\Files\6268205\ProductListPrice.txt Pilih jalur file datar.
  • Pilih {LF} dari Pembatas Baris Header
  • Periksa Column names in the first data row
  • Klik Columns halaman

Pada Columns halaman Editor Pengelola Koneksi File Datar , lakukan tindakan berikut:

  • Setel Pembatas baris ke {LF}
  • Bidang pembatas kolom mungkin dinonaktifkan. Klik Reset Columns
  • Setel Pembatas kolom ke Ç
  • Klik Advanced halaman

Pada Advanced halaman Editor Pengelola Koneksi File Datar , lakukan tindakan berikut:

  • Setel Nama ke ProductId
  • Setel ColumnDelimiter ke Ç
  • Setel Tipe Data ke Unicode string [DT_WSTR]
  • Setel Panjang ke 30
  • Klik kolom ListPrice

Pada Advanced halaman Editor Pengelola Koneksi File Datar , lakukan tindakan berikut:

  • Setel Nama ke ListPrice
  • Setel ColumnDelimiter ke {LF}
  • Setel Tipe Data ke numeric [DT_NUMERIC]
  • Setel DataPrecision ke 12
  • Setel DataScale ke 2
  • Klik OK

Seret dan lepas Data Flow task ke Alur Kontrol tab dan beri nama sebagai File to database - With Cedilla delimiter . Nonaktifkan tugas aliran data pertama.

Konfigurasikan tugas aliran data kedua dengan Flat File Source dan OLE DB Destination

Klik dua kali Flat File Source untuk membuka Flat File Source Editor . Di Connection Managers halaman Editor Sumber File Datar , pilih Pengelola Koneksi File Datar ProductListPrice_Cedilla dan klik Kolom halaman untuk mengkonfigurasi kolom. Klik OK .

Jalankan paket. Semua komponen akan menampilkan warna hijau untuk menunjukkan bahwa proses berhasil tetapi tidak ada baris yang akan diproses. Anda dapat melihat bahwa tidak ada indikasi nomor baris di antara Flat File Source dan OLE DB Destination

Klik Progress tab dan Anda akan melihat pesan peringatan berikut.

[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. Kapan Anda akan menggunakan fungsi bernilai tabel?

  2. Bagaimana cara menggunakan kembali pernyataan yang disiapkan dengan benar dan efisien di C# .NET (SQL Server)?

  3. Jenis Geografi NHibernate.Spatial dan Sql 2008 - Cara mengkonfigurasi

  4. Menggunakan hasil ekspresi (mis. Panggilan fungsi) dalam daftar parameter prosedur tersimpan?

  5. Menggunakan kondisi if dalam menyisipkan SQL Server