2009-06-22 8 views
6

छोड़ देता है मुझे यह पता लगाना प्रतीत नहीं होता कि यह कैसा हो रहा है। किसी कारण के लिए ही,FIRSTROW पैरामीटर के साथ एसक्यूएल थोक सम्मिलन निम्न पंक्ति

BULK INSERT sometable 
FROM 'E:\filefromabove.txt 
WITH 
(
FIRSTROW = 2, 
FIELDTERMINATOR= '|', 
ROWTERMINATOR = '\n' 
) 

लेकिन:

***A NICE HEADER HERE*** 
00000|SSNV|00013893-03JUN09 
0000005678|ABCD|00013893-03JUN09 
0000009112|0000|00013893-03JUN09 
0000009112|0000|00013893-03JUN09 

यहाँ मेरी थोक डालने बयान है:

यहाँ फ़ाइल है कि मैं एसक्यूएल सर्वर में थोक डालने का प्रयास कर रहा हूँ 2005 की एक उदाहरण है आउटपुट मैं प्राप्त कर सकता हूं:

0000005678|ABCD|00013893-03JUN09 
0000009112|0000|00013893-03JUN09 
0000009112|0000|00013893-03JUN09 

पहला रिकॉर्ड हमेशा छोड़ दिया जाता है, जब तक कि मैं हेडर को हटा नहीं देता पूरी तरह से और FIRSTROW पैरामीटर का उपयोग नहीं करते हैं। यह कैसे संभव है?

अग्रिम धन्यवाद!

उत्तर

12

मुझे नहीं लगता कि आप BULK INSERT/BCP के साथ एक अलग स्वरूप में पंक्तियों को छोड़ कर सकते हैं।

जब मैं इस चलाएँ:

TRUNCATE TABLE so1029384 

BULK INSERT so1029384 
FROM 'C:\Data\test\so1029384.txt' 
WITH 
(
--FIRSTROW = 2, 
FIELDTERMINATOR= '|', 
ROWTERMINATOR = '\n' 
) 

SELECT * FROM so1029384 

मैं:

col1            col2            col3 
-------------------------------------------------- -------------------------------------------------- -------------------------------------------------- 
***A NICE HEADER HERE*** 
00000SSNV            00013893-03JUN09 
0000005678           ABCD            00013893-03JUN09 
0000009112           0000            00013893-03JUN09 
0000009112           0000            00013893-03JUN09 

ऐसा लगता है कि ऐसा करना आवश्यक हो की तरह '|' यहां तक ​​कि हेडर डेटा में भी, क्योंकि यह उस पहले कॉलम में पढ़ता है - पहले कॉलम में एक नई लाइन निगलता है। जाहिर है यदि आप फ़ील्ड टर्मिनेटर पैरामीटर शामिल करते हैं, तो यह उम्मीद करता है कि प्रत्येक पंक्ति आवश्यक में एक होना चाहिए।

आप पंक्ति को प्री-प्रोसेसिंग चरण से स्ट्रिप कर सकते हैं। एक और संभावना केवल पूर्ण पंक्तियों का चयन करना है, फिर उन्हें संसाधित करें (शीर्षलेख को उखाड़ फेंकना)। या एक उपकरण का उपयोग करें जो एसएसआईएस की तरह इसे संभाल सकता है।

+0

आप सही हैं! जब मैं '||' जोड़ता हूं हेडर के अंत तक, यह ठीक काम करता है। मुझे लगता है कि मैं जो भी फाइल डाल रहा हूं, उसके बाहर हेडर को स्ट्रिप करने का प्रयास करने जा रहा हूं। धन्यवाद! – gibbo

6

शायद जांचें कि शीर्षलेख में वास्तविक डेटा पंक्तियों के समान लाइन-समापन है (जैसा कि ROWTERMINATOR में निर्दिष्ट है)?

अद्यतन:

FIRSTROW विशेषता इरादा नहीं है स्तंभ शीर्ष लेखों को छोड़ने के लिए: MSDN से। हेडर को छोड़कर बल्क INSERT कथन द्वारा समर्थित नहीं है। पंक्तियों को छोड़ते समय, SQL सर्वर डेटाबेस इंजन केवल क्षेत्र टर्मिनेटर पर दिखता है, और स्किप की गई पंक्तियों के फ़ील्ड में डेटा को मान्य नहीं करता है।

+0

हाय मार्क, हां दुर्भाग्यवश प्रत्येक पंक्ति में सीआरएलएफ है। वैसे, इनपुट के लिए धन्यवाद। – gibbo

4

मुझे पूरी लाइन को केवल एक कॉलम में पढ़ने के लिए सबसे आसान लगता है, फिर XML का उपयोग करके डेटा को पार्स करें।

IF (OBJECT_ID('tempdb..#data') IS NOT NULL) DROP TABLE #data 
CREATE TABLE #data (data VARCHAR(MAX)) 

BULK INSERT #data FROM 'E:\filefromabove.txt' WITH (FIRSTROW = 2, ROWTERMINATOR = '\n') 

IF (OBJECT_ID('tempdb..#dataXml') IS NOT NULL) DROP TABLE #dataXml 
CREATE TABLE #dataXml (ID INT NOT NULL IDENTITY(1,1) PRIMARY KEY CLUSTERED, data XML) 

INSERT #dataXml (data) 
SELECT CAST('<r><d>' + REPLACE(data, '|', '</d><d>') + '</d></r>' AS XML) 
FROM #data 

SELECT d.data.value('(/r//d)[1]', 'varchar(max)') AS col1, 
     d.data.value('(/r//d)[2]', 'varchar(max)') AS col2, 
     d.data.value('(/r//d)[3]', 'varchar(max)') AS col3 
FROM #dataXml d 
+0

यह एसएसआईएस करने से बचने के लिए एक अद्भुत लिपि है। यह मुझे केवल पहली पंक्ति आयात करने की अनुमति देता है, जांचें कि यह गंतव्य पंक्तियों के साथ मेल खाता है या नहीं, और फिर हेडर को छोड़कर सभी डेटा आयात करने के लिए आगे बढ़ें। धन्यवाद! – lwall

-1

कुछ डेटा बीसीपी गैर एसक्यूएल डेटा स्रोतों से एसक्यूएल सर्वर में आयात करने के बाद देख सकते हैं कि कैसे घायल को देखते हुए, मैं पहली बार कुछ खरोंच तालिकाओं में सभी बीसीपी आयात कर रही सुझाव देना चाहेंगे।

उदाहरण के लिए

कम तालिका Address_Import_tbl

बल्क dbo.Address_Import_tbl INSERT से 'ई: \ बाहरी \ SomeDataSource \ Address.csv' के साथ ( FIELDTERMINATOR = '|', ROWTERMINATOR = '\ एन ', MAXERRORS = 10 )

सुनिश्चित करें कि पता_Import_tbl में सभी कॉलम nvarchar() हैं, इसे यथासंभव अज्ञेयवादी बनाने के लिए, और प्रकार रूपांतरण त्रुटियों से बचें।

फिर एड्रेस_आईएमपोर्ट_टीबीएल को जो भी फिक्स आपको चाहिए, उसे लागू करें। अवांछित शीर्षलेख को हटाने की तरह।

फिर किसी भी डेटाटाइप रूपांतरणों के साथ, पता_Import_tbl से पता_टीबीएल की प्रतिलिपि बनाने के लिए एक INSERT SELECT क्वेरी चलाएं। उदाहरण के लिए, आयातित तिथियों को SQL DATETIME में डालने के लिए।

संबंधित मुद्दे