Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Dlaczego usługi SSIS nie rozpoznają ogranicznika wiersza {LF} podczas importowania zwykłego pliku UTF-8?

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 Columns strona

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 Preview strona.

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 , metoda FlatFileInput_ProcessInputRow dzieli 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 Sora z Menedżera połączeń OLE DB
  • Wybierz Table or view - fast load z 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.txt Wybierz płaską ścieżkę pliku.
  • Wybierz {LF} z Ogranicznik wiersza nagłówka
  • Sprawdź Column names in the first data row
  • Kliknij Columns strona

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 Advanced strona

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dodaj wiele rekordów za pomocą Linq-to-SQL

  2. com.microsoft.sqlserver.jdbc.SQLServerException:Wariant typu danych nie jest obsługiwany

  3. Jak zastąpić NULL pustym ciągiem w SQL?

  4. Znajdź zależności w SQL Server:sql_expression_dependencies

  5. SQL Server 2008:Mam 1000 tabel, muszę wiedzieć, które tabele zawierają dane