Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Perché SSIS non riconosce il delimitatore di riga {LF} di avanzamento riga durante l'importazione di file flat UTF-8?

Causa:

SSIS non riesce a leggere il file e visualizza il seguente avviso a causa del delimitatore di colonna Ç ("c" con cedilla ) e not a causa del delimitatore di riga {LF} (Avanzamento riga ).

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

Ecco un pacchetto SSIS di esempio che mostra come risolvere il problema utilizzando Script Component e alla fine c'è un altro esempio che simula il tuo problema.

Risoluzione:

Di seguito il pacchetto di esempio è scritto in SSIS 2008 R2 . Legge un file flat con delimitatore di riga {LF} come valore di una singola colonna; quindi divide i dati utilizzando Script Component per inserire le informazioni in una tabella in SQL Server 2008 R2 banca dati.

Usa Notepad++ per creare un semplice file flat con poche righe. Il file di esempio seguente ha ID prodotto e Prezzo di listino informazioni su ogni riga separate da Ç come delimitatore di colonna e ogni riga termina con {LF} delimitatore.

In Notepad++, fai clic su Encoding e quindi fare clic su Encoding in UTF-8 per salvare il file flat in UTF-8 codifica.

L'esempio utilizzerà un SQL Server 2008 R2 database denominato Sora . Crea una nuova tabella denominata dbo.ProductListPrice utilizzando lo script indicato di seguito. SSIS inserirà i dati del file flat in questa tabella.

USE Sora;
GO

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

Crea un pacchetto SSIS utilizzando Business Intelligence Development Studio (BIDS) 2008 R2 . Assegna un nome al pacchetto come SO_6268205.dtsx . Crea un'origine dati denominata Sora.ds per connettersi al database Sora in SQL Server 2008 R2 .

Fare clic con il pulsante destro del mouse in un punto qualsiasi all'interno del pacchetto, quindi fare clic su Variables per visualizzare il riquadro delle variabili. Crea una nuova variabile denominata ColumnDelimiter di tipo di dati String nell'ambito del pacchetto SO_6268205 e imposta la variabile con il valore Ç

Fare clic con il pulsante destro del mouse su Connection Managers e fare clic su New Flat File Connection... per creare una connessione per leggere il file flat.

Sul General pagina dell'Editor Flat File Connection Manager , esegui le seguenti azioni:

  • Imposta nome gestore connessione a ProductListPrice
  • Imposta Descrizione a Flat file connection manager to read product list price information.
  • Seleziona il percorso del file flat. Ho il file nel percorso C:\Siva\StackOverflow\Files\6268205\ProductListPrice.txt
  • Seleziona {LF} da Delimitatore di riga dell'intestazione
  • Controlla Column names in the first data row
  • Fai clic su Columns pagina

Nelle Columns pagina dell'Editor Flat File Connection Manager , verifica che il Column delimiter è vuoto e disabilitato. Fai clic su Advanced pagina.

Su Advanced pagina dell'Editor Flat File Connection Manager , esegui le seguenti azioni.

  • Imposta il Nome a LineData
  • Verifica che il Delimitatore di colonna è impostato su {LF}
  • Imposta il Tipo di dati a Unicode string [DT_WSTR]
  • Imposta OutputColumnWidth a 255
  • Fai clic su Preview pagina.

Nell'Preview pagina dell'Editor Flat File Connection Manager , verifica che i dati visualizzati siano corretti e fai clic su OK .

Vedrai l'origine dati Sora e il gestore di connessione file flat ProductListPrice sui Connection Managers scheda nella parte inferiore del pacchetto.

Trascina e rilascia Data Flow Task nel Flusso di controllo scheda del pacchetto e denominalo come File to database - Without Cedilla delimiter

Fare doppio clic su Attività flusso di dati per passare la vista al Data Flow scheda sul pacchetto. Trascina e rilascia un Flat File Source nel Flusso di dati scheda. Fare doppio clic su Sorgente file flat per aprire Flat File Source Editor .

In Connection Managers pagina dell'Editor sorgente file flat , seleziona Gestione connessione file flat ProductListPrice e fai clic su Colonne pagina.

Nelle Columns pagina dell'Editor sorgente file flat , controlla la colonna LineData e fai clic su OK .

Trascina e rilascia un Script Component nel Flusso di dati scheda sotto la Fonte file flat , seleziona Transformation e fai clic su OK . Collega la freccia verde da Fonte file flat a Componente di script . Fare doppio clic su Componente script per aprire Script Transformation Editor .

Fai clic su Colonne di input su Editor trasformazione script e seleziona LineData colonna. Fai clic su Ingressi e uscite pagina.

Su Inputs and Outputs pagina dell'Editor trasformazione script , esegui le seguenti azioni.

  • Cambia il nome degli input in FlatFileInput
  • Cambia il nome delle uscite in SplitDataOutput
  • Seleziona Colonne di output e fai clic su Add Column . Ripeti l'operazione per aggiungere un'altra colonna.
  • Nomina la prima colonna ProductId
  • Imposta il Tipo di dati della colonna ProductId a Unicode string [DT_WSTR]
  • Imposta la Lunghezza a 30

Su Inputs and Outputs pagina dell'Editor trasformazione script , esegui le seguenti azioni.

  • Nomina la seconda colonna ListPrice
  • Imposta il Tipo di dati della colonna PrezzoLista a numeric [DT_NUMERIC]
  • Imposta la Precisione a 12
  • Imposta la Scala a 2
  • Fai clic su Script pagina per modificare lo script

Nello Script pagina dell'Editor trasformazione script , esegui le seguenti azioni.

  • Fai clic sul pulsante con i puntini di sospensione su ReadOnlyVariables e seleziona la variabile User::ColumnDelimiter
  • Fai clic su Edit Script...

Incolla il seguente C# nell'editor di script. Lo script esegue le seguenti attività.

  • Utilizzo del valore del delimitatore di colonna Ç definito nella variabile Utente::ColumnDelimiter , il metodo FlatFileInput_ProcessInputRow divide il valore in ingresso e lo assegna alle due colonne di output definite nella trasformazione Componente script.

Codice componente script in 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]);
    }
}

Trascina e rilascia OLE DB Destination nel Flusso di dati scheda. Collega la freccia verde da Componente script a Destinazione OLE DB . Fare doppio clic su Destinazione OLE DB per aprire OLE DB Destination Editor .

In Connection Managers pagina dell'Editor di destinazione OLE DB , esegui le seguenti azioni.

  • Seleziona Sora da Gestione connessioni OLE DB
  • Seleziona Table or view - fast load da Modalità di accesso ai dati
  • Seleziona [dbo].[ProductListPrice] da Nome della tabella o della vista
  • Fai clic su Mapping pagina

Fai clic su Mappings pagina nell'Editor di destinazione OLE DB mapperebbe automaticamente le colonne se i nomi delle colonne di input e output sono gli stessi. Fare clic su OK .

Flusso di dati la scheda dovrebbe essere simile a questa dopo aver configurato tutti i componenti.

Esegui la query select * from dbo.ProductListPrice in SQL Server Management Studio (SSMS) per trovare il numero di righe nella tabella. Dovrebbe essere vuoto prima di eseguire il pacchetto.

Esegui il pacchetto. Noterai che il pacco è stato elaborato correttamente 9 righe. Il file flat contiene 10 righe ma la prima riga è l'intestazione con i nomi delle colonne.

Esegui la query select * from dbo.ProductListPrice in SQL Server Management Studio (SSMS) per trovare il 9 righe inserite correttamente nella tabella. I dati devono corrispondere ai dati del file flat.

L'esempio precedente ha illustrato come dividere manualmente i dati utilizzando Componente script perché Gestione connessione file flat incontra un errore durante la configurazione del delimitatore di colonna Ç

Simulazione problema:

Questo esempio mostra un Gestione connessioni file flat separato configurato con delimitatore di colonna Ç , che viene eseguito ma incontra un avviso e non elabora alcuna riga.

Fare clic con il pulsante destro del mouse su Connection Managers e fare clic su New Flat File Connection... per creare una connessione per leggere il file flat. Sul General pagina dell'Editor Flat File Connection Manager , esegui le seguenti azioni:

  • Imposta nome gestore connessione a ProductListPrice_Cedilla
  • Imposta la descrizione su Flat file connection manager with Cedilla column delimiter.
  • Ho il file nel percorso C:\Siva\StackOverflow\Files\6268205\ProductListPrice.txt Seleziona il percorso del file flat.
  • Seleziona {LF} da Delimitatore di riga dell'intestazione
  • Controlla Column names in the first data row
  • Fai clic su Columns pagina

Nelle Columns pagina dell'Editor Flat File Connection Manager , esegui le seguenti azioni:

  • Imposta Delimitatore di riga a {LF}
  • Il campo delimitatore di colonna potrebbe essere disabilitato. Fai clic su Reset Columns
  • Imposta Delimitatore di colonna a Ç
  • Fai clic su Advanced pagina

Su Advanced pagina dell'Editor Flat File Connection Manager , esegui le seguenti azioni:

  • Imposta il Nome a ProductId
  • Imposta il ColumnDelimiter a Ç
  • Imposta il Tipo di dati a Unicode string [DT_WSTR]
  • Imposta la Lunghezza a 30
  • Fai clic sulla colonna ListPrice

Su Advanced pagina dell'Editor Flat File Connection Manager , esegui le seguenti azioni:

  • Imposta il Nome a ListPrice
  • Imposta il ColumnDelimiter a {LF}
  • Imposta il Tipo di dati a numeric [DT_NUMERIC]
  • Imposta DataPrecision a 12
  • Imposta DataScale a 2
  • Fai clic su OK

Trascina e rilascia un'Data Flow task nel Flusso di controllo scheda e denominalo come File to database - With Cedilla delimiter . Disabilita la prima attività del flusso di dati.

Configura la seconda attività del flusso di dati con Flat File Source e OLE DB Destination

Fare doppio clic sulla sorgente file flat per aprire Flat File Source Editor . In Connection Managers pagina dell'Editor sorgente file flat , seleziona Gestione connessione file flat ProductListPrice_Cedilla e fai clic su Colonne pagina per configurare le colonne. Fare clic su OK .

Esegui il pacchetto. Tutti i componenti visualizzeranno il colore verde per indicare che il processo è andato a buon fine ma nessuna riga verrà elaborata. Puoi vedere che non ci sono indicazioni di numeri di righe tra il Flat File Source e OLE DB Destination

Fai clic su Progress scheda e noterai il seguente messaggio di avviso.

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