Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

UTF-8 फ्लैट फ़ाइल आयात करते समय SSIS लाइन फ़ीड {LF} पंक्ति सीमांकक को क्यों नहीं पहचानता है?

कारण:

SSIS फ़ाइल को पढ़ने में विफल रहता है और स्तंभ सीमांकक Ç के कारण नीचे दी गई चेतावनी प्रदर्शित करता है ("c" सेडिला के साथ ) और not लाइन सीमांकक के कारण {LF} (लाइन फ़ीड )।

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

यहां एक नमूना SSIS पैकेज दिया गया है जो दिखाता है कि Script Component . का उपयोग करके समस्या का समाधान कैसे किया जाता है और अंत में एक और उदाहरण है जो आपकी समस्या का अनुकरण करता है।

संकल्प:

नीचे नमूना पैकेज SSIS 2008 R2 में लिखा गया है . यह पंक्ति सीमांकक के साथ एक फ्लैट फ़ाइल पढ़ता है {LF} एकल स्तंभ मान के रूप में; फिर Script Component . का उपयोग करके डेटा को विभाजित करता है SQL Server 2008 R2 में तालिका में जानकारी सम्मिलित करने के लिए डेटाबेस।

नोटपैड++ का उपयोग करें कुछ पंक्तियों के साथ एक साधारण फ्लैट फ़ाइल बनाने के लिए। नीचे दी गई नमूना फ़ाइल में उत्पाद आईडी है और सूची मूल्य Ç . द्वारा अलग की गई प्रत्येक पंक्ति की जानकारी स्तंभ सीमांकक के रूप में और प्रत्येक पंक्ति {LF} . के साथ समाप्त होती है सीमांकक।

Notepad++ पर, Encoding पर क्लिक करें और फिर Encoding in UTF-8 . पर क्लिक करें फ़्लैट फ़ाइल को UTF-8 . में सहेजने के लिए एन्कोडिंग।

नमूना SQL Server 2008 R2 का उपयोग करेगा डेटाबेस नाम Sora . dbo.ProductListPrice . नामक एक नई तालिका बनाएं नीचे दी गई स्क्रिप्ट का उपयोग करना। SSIS इस तालिका में फ़्लैट फ़ाइल डेटा सम्मिलित करेगा।

USE Sora;
GO

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

बिजनेस इंटेलिजेंस डेवलपमेंट स्टूडियो (BIDS) 2008 R2 का उपयोग करके एक SSIS पैकेज बनाएं . पैकेज को SO_6268205.dtsx . नाम दें . Sora.ds . नाम का डेटा स्रोत बनाएं डेटाबेस से कनेक्ट करने के लिए Sora SQL सर्वर 2008 R2 में ।

पैकेज के अंदर कहीं भी राइट-क्लिक करें और फिर Variables . पर क्लिक करें चर फलक देखने के लिए। ColumnDelimiter . नाम से एक नया वेरिएबल बनाएं डेटा प्रकार का String पैकेज के दायरे में SO_6268205 और वैरिएबल को Ç . मान के साथ सेट करें

Connection Managers पर राइट-क्लिक करें और क्लिक करें New Flat File Connection... फ़्लैट फ़ाइल पढ़ने के लिए कनेक्शन बनाने के लिए।

General . पर फ्लैट फ़ाइल कनेक्शन प्रबंधक संपादक . का पृष्ठ , निम्नलिखित क्रियाएं करें:

  • सेट करें कनेक्शन प्रबंधक का नाम करने के लिए ProductListPrice
  • सेट विवरण उत्पाद सूची मूल्य जानकारी पढ़ने के लिए Flat file connection manager to read product list price information.
  • फ्लैट फ़ाइल पथ का चयन करें। मेरे पास पथ में फ़ाइल है C:\Siva\StackOverflow\Files\6268205\ProductListPrice.txt
  • {LF}चुनें शीर्षलेख पंक्ति सीमांकक . से
  • Column names in the first data row
  • क्लिक करें Columns पेज

Columns . पर फ्लैट फ़ाइल कनेक्शन प्रबंधक संपादक . का पृष्ठ , सत्यापित करें कि Column delimiter खाली और अक्षम है। Advanced क्लिक करें पेज.

Advanced . पर फ्लैट फ़ाइल कनेक्शन प्रबंधक संपादक . का पृष्ठ , निम्नलिखित क्रियाएं करें।

  • नाम सेट करें करने के लिए LineData
  • सत्यापित करें कि स्तंभ सीमांकक {LF} . पर सेट है
  • डेटा प्रकार सेट करें करने के लिए Unicode string [DT_WSTR]
  • OutputColumnWidth सेट करें करने के लिए 255
  • Preview पर क्लिक करें पेज.

Preview . पर फ्लैट फ़ाइल कनेक्शन प्रबंधक संपादक . का पृष्ठ , सत्यापित करें कि प्रदर्शित डेटा सही दिखता है और OK . पर क्लिक करें

आप डेटा स्रोत देखेंगे सोरा और फ्लैट फ़ाइल कनेक्शन प्रबंधक ProductListPrice Connection Managers . पर पैकेज के नीचे टैब।

Data Flow Task को खींचें और छोड़ें नियंत्रण प्रवाह . पर पैकेज का टैब और इसे नाम दें File to database - Without Cedilla delimiter

डेटा प्रवाह कार्य पर डबल-क्लिक करें दृश्य को Data Flow . पर स्विच करने के लिए पैकेज पर टैब। एक Flat File Source को खींचें और छोड़ें डेटा प्रवाह . पर टैब। फ्लैट फ़ाइल स्रोत पर डबल-क्लिक करें खोलने के लिए Flat File Source Editor

Connection Manager . पर फ्लैट फ़ाइल स्रोत संपादक . का पृष्ठ , फ्लैट फ़ाइल कनेक्शन प्रबंधक . चुनें ProductListPrice और कॉलम क्लिक करें पेज.

Columns . पर फ्लैट फ़ाइल स्रोत संपादक . का पृष्ठ , कॉलम देखें LineData और क्लिक करें OK

Script Componentको खींचें और छोड़ें डेटा प्रवाह . पर फ्लैट फ़ाइल स्रोत . के नीचे टैब , चुनें Transformation और क्लिक करें OK . फ्लैट फ़ाइल स्रोत . से हरा तीर कनेक्ट करें स्क्रिप्ट घटक . के लिए . स्क्रिप्ट घटक पर डबल-क्लिक करें खोलने के लिए Script Transformation Editor

इनपुट कॉलम पर क्लिक करें स्क्रिप्ट परिवर्तन संपादक . पर और LineData . चुनें कॉलम। इनपुट और आउटपुट पर क्लिक करें पेज.

Inputs and Outputs पर स्क्रिप्ट परिवर्तन संपादक . का पृष्ठ , निम्नलिखित क्रियाएं करें।

  • इनपुट नाम को FlatFileInput में बदलें
  • आउटपुट का नाम बदलकर SplitDataOutput . करें
  • आउटपुट कॉलम चुनें और Add Column . पर क्लिक करें . एक और कॉलम जोड़ने के लिए इसे दोबारा दोहराएं।
  • पहले कॉलम को नाम दें ProductId
  • डेटा प्रकार सेट करें कॉलम ProductId . का करने के लिए Unicode string [DT_WSTR]
  • लंबाई सेट करें करने के लिए 30

Inputs and Outputs पर स्क्रिप्ट परिवर्तन संपादक . का पृष्ठ , निम्नलिखित क्रियाएं करें।

  • दूसरे कॉलम को नाम दें ListPrice
  • डेटा प्रकार सेट करें कॉलम का सूची मूल्य से numeric [DT_NUMERIC]
  • परिशुद्धता सेट करें करने के लिए 12
  • पैमाना सेट करें करने के लिए 2
  • स्क्रिप्टक्लिक करें पृष्ठ स्क्रिप्ट को संशोधित करने के लिए

Script . पर स्क्रिप्ट परिवर्तन संपादक . का पृष्ठ , निम्नलिखित क्रियाएं करें।

  • केवल पढ़ने योग्य चर के सामने दीर्घवृत्त बटन क्लिक करें और वेरिएबल का चयन करें User::ColumnDelimiter
  • क्लिक करें Edit Script...

नीचे दिए गए C# को Script Editor में पेस्ट करें। स्क्रिप्ट निम्नलिखित कार्य करती है।

  • स्तंभ सीमांकक मान का उपयोग करना Ç चर में परिभाषित उपयोगकर्ता::ColumnDelimiter , विधि FlatFileInput_ProcessInputRow आने वाले मान को विभाजित करता है और इसे स्क्रिप्ट घटक परिवर्तन में परिभाषित दो आउटपुट कॉलम में असाइन करता है।

सी#में स्क्रिप्ट घटक कोड

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]);
    }
}

खींचें और छोड़ें OLE DB Destination डेटा प्रवाह . पर टैब। स्क्रिप्ट घटक . से हरा तीर कनेक्ट करें OLE DB गंतव्य . के लिए . OLE DB गंतव्य पर डबल-क्लिक करें खोलने के लिए OLE DB Destination Editor

Connection Manager . पर OLE DB गंतव्य संपादक . का पृष्ठ , निम्नलिखित क्रियाएं करें।

  • चुनें Sora OLE DB कनेक्शन प्रबंधक . से
  • Table or view - fast load डेटा एक्सेस मोड . से
  • [dbo].[ProductListPrice] तालिका या दृश्य का नाम . से
  • मैपिंगक्लिक करें पेज

Mappings पर क्लिक करें OLE DB गंतव्य संपादक . पर पृष्ठ यदि इनपुट और आउटपुट कॉलम नाम समान हैं, तो स्वचालित रूप से कॉलम को मैप कर देगा। क्लिक करें OK

डेटा प्रवाह सभी घटकों को कॉन्फ़िगर करने के बाद टैब कुछ इस तरह दिखना चाहिए।

क्वेरी निष्पादित करें select * from dbo.ProductListPrice SQL सर्वर प्रबंधन स्टूडियो (SSMS) . में तालिका में पंक्तियों की संख्या ज्ञात करने के लिए। पैकेज को क्रियान्वित करने से पहले यह खाली होना चाहिए।

पैकेज निष्पादित करें। आप देखेंगे कि पैकेज सफलतापूर्वक संसाधित हुआ 9 पंक्तियाँ। फ़्लैट फ़ाइल में 10 . है पंक्तियाँ लेकिन पहली पंक्ति स्तंभ नामों के साथ शीर्षलेख है।

क्वेरी निष्पादित करें select * from dbo.ProductListPrice SQL सर्वर प्रबंधन स्टूडियो (SSMS) . में 9 . को खोजने के लिए पंक्तियों को तालिका में सफलतापूर्वक डाला गया। डेटा फ्लैट फ़ाइल डेटा से मेल खाना चाहिए।

ऊपर दिए गए उदाहरण में बताया गया है कि स्क्रिप्ट घटक . का उपयोग करके डेटा को मैन्युअल रूप से कैसे विभाजित किया जाए क्योंकि फ्लैट फ़ाइल कनेक्शन प्रबंधक स्तंभ सीमांकक कॉन्फ़िगर करते समय त्रुटि का सामना करना पड़ता है Ç

समस्या सिमुलेशन:

यह उदाहरण एक अलग फ्लैट फ़ाइल कनेक्शन प्रबंधक . दिखाता है स्तंभ सीमांकक के साथ कॉन्फ़िगर किया गया Ç , जो निष्पादित करता है लेकिन चेतावनी का सामना करता है और किसी भी लाइन को संसाधित नहीं करता है।

Connection Managers पर राइट-क्लिक करें और क्लिक करें New Flat File Connection... फ्लैट फ़ाइल को पढ़ने के लिए एक कनेक्शन बनाने के लिए। General . पर फ्लैट फ़ाइल कनेक्शन प्रबंधक संपादक . का पृष्ठ , निम्नलिखित क्रियाएं करें:

  • सेट करें कनेक्शन प्रबंधक का नाम करने के लिए ProductListPrice_Cedilla
  • विवरण को Flat file connection manager with Cedilla column delimiter.
  • मेरे पास पथ में फ़ाइल है C:\Siva\StackOverflow\Files\6268205\ProductListPrice.txt समतल फ़ाइल पथ का चयन करें।
  • {LF}चुनें शीर्षलेख पंक्ति सीमांकक . से
  • Column names in the first data row
  • क्लिक करें Columns पेज

Columns . पर फ्लैट फ़ाइल कनेक्शन प्रबंधक संपादक . का पृष्ठ , निम्नलिखित क्रियाएं करें:

  • पंक्ति सीमांकक सेट करें करने के लिए {LF}
  • स्तंभ सीमांकक फ़ील्ड अक्षम किया जा सकता है। Reset Columns Click पर क्लिक करें
  • स्तंभ सीमांकक सेट करें करने के लिए Ç
  • क्लिक करें Advanced पेज

Advanced . पर फ्लैट फ़ाइल कनेक्शन प्रबंधक संपादक . का पृष्ठ , निम्नलिखित क्रियाएं करें:

  • नाम सेट करें करने के लिए ProductId
  • कॉलम डिलीमीटर सेट करें करने के लिए Ç
  • डेटा प्रकार सेट करें करने के लिए Unicode string [DT_WSTR]
  • लंबाई सेट करें करने के लिए 30
  • कॉलम पर क्लिक करें ListPrice

Advanced . पर फ्लैट फ़ाइल कनेक्शन प्रबंधक संपादक . का पृष्ठ , निम्नलिखित क्रियाएं करें:

  • नाम सेट करें करने के लिए ListPrice
  • कॉलम डिलीमीटर सेट करें करने के लिए {LF}
  • डेटा प्रकार सेट करें से numeric [DT_NUMERIC]
  • डेटा प्रेसिजन सेट करें करने के लिए 12
  • डेटा स्केल सेट करें करने के लिए 2
  • क्लिक करें OK

किसी Data Flow Task को खींचें और छोड़ें नियंत्रण प्रवाह . पर टैब और इसे नाम दें File to database - With Cedilla delimiter . पहला डेटा प्रवाह कार्य अक्षम करें।

दूसरे डेटा प्रवाह कार्य को Flat File Source . के साथ कॉन्फ़िगर करें और OLE DB Destination

Flat File Source Editor खोलने के लिए फ़्लैट फ़ाइल स्रोत पर डबल-क्लिक करें . Connection Manager . पर फ्लैट फ़ाइल स्रोत संपादक . का पृष्ठ , फ्लैट फ़ाइल कनेक्शन प्रबंधक . चुनें ProductListPrice_Cedilla और कॉलम क्लिक करें कॉलम को कॉन्फ़िगर करने के लिए पेज। क्लिक करें OK

पैकेज निष्पादित करें। सभी घटक हरे रंग को प्रदर्शित करेंगे यह इंगित करने के लिए कि प्रक्रिया सफल रही लेकिन कोई पंक्ति संसाधित नहीं की जाएगी। आप देख सकते हैं कि Flat File Source . के बीच कोई पंक्ति संख्या संकेत नहीं हैं और OLE DB Destination

Progress पर क्लिक करें टैब और आप निम्न चेतावनी संदेश देखेंगे।

[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. मैं एक ही चयन कथन में एकाधिक सामान्य तालिका अभिव्यक्ति कैसे प्राप्त कर सकता हूं?

  2. tsql किसी फ़ंक्शन या स्टोर प्रक्रिया से तालिका लौटा रहा है

  3. इकाई डेटा ढांचे से ट्रिगर के बजाय तालिका में डालने पर त्रुटि

  4. एक आईडी द्वारा समूहीकृत अल्पविराम सीमांकित सूची का चयन करें

  5. SQL सर्वर:दो तिथियों के बीच कुल दिन प्राप्त करें