Przyczyna:
SSIS nie odczytuje pliku i wyświetla poniższe ostrzeżenie z powodu ogranicznika kolumny Ç ("c" z cedillą ) i not ze względu na ogranicznik linii {LF} (Kanał wiersza ).
[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.
Oto przykładowy pakiet SSIS, który pokazuje, jak rozwiązać problem za pomocą Script Component a na końcu jest inny przykład, który symuluje Twój problem.
Rozdzielczość:
Poniższy przykładowy pakiet jest napisany w SSIS 2008 R2 . Czyta płaski plik z separatorem wierszy {LF} jako wartość w pojedynczej kolumnie; następnie dzieli dane za pomocą Script Component aby wstawić informacje do tabeli w SQL Server 2008 R2 baza danych.
Użyj Notepad++
stworzyć prosty plik płaski z kilkoma wierszami. Poniższy przykładowy plik ma Identyfikator produktu i Cena katalogowa informacje w każdym wierszu oddzielone Ç jako ogranicznik kolumny, a każdy wiersz kończy się {LF} ogranicznik.

W Notepad++ kliknij Encoding a następnie kliknij Encoding in UTF-8 aby zapisać płaski plik w UTF-8 kodowanie.

Przykład będzie używał SQL Server 2008 R2 baza danych o nazwie Sora . Utwórz nową tabelę o nazwie dbo.ProductListPrice za pomocą poniższego skryptu. SSIS wstawi do tej tabeli dane w postaci zwykłego pliku.
USE Sora;
GO
CREATE TABLE dbo.ProductListPrice
(
ProductId nvarchar(30) NOT NULL
, ListPrice numeric(12,2) NOT NULL
);
GO
Utwórz pakiet SSIS za pomocą Business Intelligence Development Studio (BIDS) 2008 R2 . Nazwij pakiet jako SO_6268205.dtsx . Utwórz źródło danych o nazwie Sora.ds połączyć się z bazą danych Sora w SQL Server 2008 R2 .
Kliknij prawym przyciskiem myszy w dowolnym miejscu pakietu, a następnie kliknij Variables aby wyświetlić okienko zmiennych. Utwórz nową zmienną o nazwie ColumnDelimiter typu danych String w zakresie pakietu SO_6268205 i ustaw zmienną na wartość Ç

Kliknij prawym przyciskiem myszy Connection Managers i kliknij New Flat File Connection... aby utworzyć połączenie w celu odczytania pliku płaskiego.

W sekcji General strona Edytora menedżera połączeń z płaskim plikiem , wykonaj następujące czynności:
- Ustaw nazwę menedżera połączeń do
ProductListPrice - Ustaw Opis do
Flat file connection manager to read product list price information. - Wybierz płaską ścieżkę pliku. Mam plik w ścieżce
C:\Siva\StackOverflow\Files\6268205\ProductListPrice.txt - Wybierz
{LF}z Ogranicznik wiersza nagłówka - Sprawdź
Column names in the first data row - Kliknij
Columnsstrona

W Columns strona Edytora menedżera połączeń z płaskim plikiem , sprawdź, czy Column delimiter jest puste i wyłączone. Kliknij Advanced strona.

W Advanced strona Edytora menedżera połączeń z płaskim plikiem , wykonaj następujące czynności.
- Ustaw nazwę do
LineData - Sprawdź, czy ogranicznik kolumny jest ustawiony na
{LF} - Ustaw Typ danych do
Unicode string [DT_WSTR] - Ustaw OutputColumnWidth do
255 - Kliknij
Previewstrona.

W Preview strona Edytora menedżera połączeń z płaskim plikiem , sprawdź, czy wyświetlane dane wyglądają prawidłowo i kliknij OK .

Zobaczysz źródło danych Sora i menedżera połączeń plików płaskich ProductListPrice w Connection Managers zakładka na dole opakowania.

Przeciągnij i upuść Data Flow Task na przepływ sterowania pakietu i nazwij go jako File to database - Without Cedilla delimiter

Kliknij dwukrotnie Zadanie przepływu danych aby przełączyć widok na Data Flow zakładka na opakowaniu. Przeciągnij i upuść Flat File Source w przepływie danych patka. Kliknij dwukrotnie Źródło pliku płaskiego aby otworzyć Flat File Source Editor .
W Connection Managers strona Edytora źródeł plików płaskich , wybierz Menedżera połączeń plików płaskich ProductListPrice i kliknij Kolumny strona.

W Columns strona Edytora źródeł plików płaskich , sprawdź kolumnę LineData i kliknij OK .

Przeciągnij i upuść Script Component na przepływ danych zakładka pod Źródłem pliku płaskiego , wybierz Transformation i kliknij OK . Połącz zieloną strzałkę ze Źródła pliku płaskiego do komponentu skryptów . Kliknij dwukrotnie Komponent skryptu aby otworzyć Script Transformation Editor .
Kliknij Kolumny wejściowe w Edytorze transformacji skryptów i wybierz LineData kolumna. Kliknij Wejścia i wyjścia strona.

Na Inputs and Outputs strona Edytora transformacji skryptów , wykonaj następujące czynności.
- Zmień nazwę wejścia na FlatFileInput
- Zmień nazwę wyjścia na
SplitDataOutput - Wybierz Kolumny wyjściowe i kliknij
Add Column. Powtórz to jeszcze raz, aby dodać kolejną kolumnę. - Nazwij pierwszą kolumnę
ProductId - Ustaw Typ danych kolumny Identyfikator produktu do
Unicode string [DT_WSTR] - Ustaw Długość do
30

Na Inputs and Outputs strona Edytora transformacji skryptów , wykonaj następujące czynności.
- Nazwij drugą kolumnę
ListPrice - Ustaw Typ danych kolumny ListPrice do
numeric [DT_NUMERIC] - Ustaw precyzję do
12 - Ustaw skalę do
2 - Kliknij Skrypt strona do modyfikacji skryptu

W Script strona Edytora transformacji skryptów , wykonaj następujące czynności.
- Kliknij przycisk z wielokropkiem na ReadOnlyVariables i wybierz zmienną
User::ColumnDelimiter - Kliknij
Edit Script...

Wklej poniższy C# w edytorze skryptów. Skrypt wykonuje następujące zadania.
- Korzystanie z wartości ogranicznika kolumny
Çzdefiniowana w zmiennej User::ColumnDelimiter , metodaFlatFileInput_ProcessInputRowdzieli przychodzącą wartość i przypisuje ją do dwóch kolumn wyjściowych zdefiniowanych w transformacji komponentu skryptu.
Kod komponentu skryptu w 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]);
}
}

Przeciągnij i upuść OLE DB Destination na przepływ danych patka. Połącz zieloną strzałkę z komponentu skryptów do miejsca docelowego OLE DB . Kliknij dwukrotnie Miejsce docelowe OLE DB aby otworzyć OLE DB Destination Editor .
W Connection Managers strona Edytora docelowego OLE DB , wykonaj następujące czynności.
- Wybierz
Soraz Menedżera połączeń OLE DB - Wybierz
Table or view - fast loadz trybu dostępu do danych - Wybierz
[dbo].[ProductListPrice]z Nazwa tabeli lub widoku - Kliknij Odwzorowania strona

Kliknij Mappings w Edytorze miejsca docelowego OLE DB automatycznie mapuje kolumny, jeśli nazwy kolumn wejściowych i wyjściowych są takie same. Kliknij OK .

Przepływ danych zakładka powinna wyglądać mniej więcej tak po skonfigurowaniu wszystkich komponentów.

Wykonaj zapytanie select * from dbo.ProductListPrice w SQL Server Management Studio (SSMS) aby znaleźć liczbę wierszy w tabeli. Powinien być pusty przed wykonaniem pakietu.

Wykonaj pakiet. Zauważysz, że paczka została pomyślnie przetworzona 9 wydziwianie. Plik płaski zawiera 10 wiersze, ale pierwszy wiersz to nagłówek z nazwami kolumn.

Wykonaj zapytanie select * from dbo.ProductListPrice w SQL Server Management Studio (SSMS) znaleźć 9 wiersze pomyślnie wstawione do tabeli. Dane powinny być zgodne z danymi w pliku tekstowym.

Powyższy przykład ilustruje, jak ręcznie podzielić dane za pomocą komponentu skryptów ponieważ Menedżer połączeń plików płaskich napotyka błąd podczas konfigurowania ogranicznika kolumny Ç
Symulacja problemu:
Ten przykład pokazuje oddzielny Menedżer połączeń plików płaskich skonfigurowany z ogranicznikiem kolumny Ç , który wykonuje się, ale napotyka ostrzeżenie i nie przetwarza żadnych wierszy.
Kliknij prawym przyciskiem myszy Connection Managers i kliknij New Flat File Connection... aby utworzyć połączenie w celu odczytania pliku tekstowego. W sekcji General strona Edytora menedżera połączeń z płaskim plikiem , wykonaj następujące czynności:
- Ustaw nazwę menedżera połączeń do
ProductListPrice_Cedilla - Ustaw Opis na
Flat file connection manager with Cedilla column delimiter. - Mam plik w ścieżce
C:\Siva\StackOverflow\Files\6268205\ProductListPrice.txtWybierz płaską ścieżkę pliku. - Wybierz
{LF}z Ogranicznik wiersza nagłówka - Sprawdź
Column names in the first data row - Kliknij
Columnsstrona

W Columns strona Edytora menedżera połączeń z płaskim plikiem , wykonaj następujące czynności:
- Ustaw separator wierszy do
{LF} - Pole ogranicznika kolumny może być wyłączone. Kliknij
Reset Columns - Ustaw ogranicznik kolumny do
Ç - Kliknij
Advancedstrona

W Advanced strona Edytora menedżera połączeń z płaskim plikiem , wykonaj następujące czynności:
- Ustaw nazwę do
ProductId - Ustaw ColumnDelimiter do
Ç - Ustaw Typ danych do
Unicode string [DT_WSTR] - Ustaw Długość do
30 - Kliknij kolumnę
ListPrice

W Advanced strona Edytora menedżera połączeń z płaskim plikiem , wykonaj następujące czynności:
- Ustaw nazwę do
ListPrice - Ustaw ColumnDelimiter do
{LF} - Ustaw Typ danych do
numeric [DT_NUMERIC] - Ustaw DataPrecision do
12 - Ustaw skalę danych do
2 - Kliknij
OK

Przeciągnij i upuść Data Flow task na przepływ sterowania i nazwij go jako File to database - With Cedilla delimiter . Wyłącz pierwsze zadanie przepływu danych.

Skonfiguruj drugie zadanie przepływu danych za pomocą Flat File Source i OLE DB Destination

Kliknij dwukrotnie Źródło plików płaskich, aby otworzyć Flat File Source Editor . W Connection Managers strona Edytora źródeł plików płaskich , wybierz Menedżera połączeń plików płaskich ProductListPrice_Cedilla i kliknij Kolumny stronę, aby skonfigurować kolumny. Kliknij OK .

Wykonaj pakiet. Wszystkie składniki będą wyświetlane w kolorze zielonym, co oznacza, że proces zakończył się sukcesem, ale żadne wiersze nie zostaną przetworzone. Widać, że między Flat File Source nie ma wskazania numerów wierszy i OLE DB Destination

Kliknij Progress i zobaczysz następujący komunikat ostrzegawczy.
[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.
