การนำเข้าข้อมูล Excel ดูเหมือนว่าจะให้ค่า Null แบบสุ่ม

การใช้ SSIS สำหรับ Visual Studio 2017 สำหรับการนำเข้าไฟล์ Excel บางไฟล์

ฉันได้สร้างแพ็คเกจที่มีคอนเทนเนอร์ลูปหลายตัวที่เรียกใช้แพ็คเกจเฉพาะเพื่อจัดการไฟล์บางไฟล์ ฉันมีปัญหากับแพ็คเกจหนึ่งที่ถูกดำเนินการโดยที่ดูเหมือนว่าจะสุ่มตัดสินใจว่าข้อมูลสำหรับคอลัมน์เป็น NULL ต่อไฟล์ Excel ฉัน/รู้สึกว่านี่เป็นส่วนหนึ่งของการตั้งค่ารีจิสทรีสำหรับ TypeGuessRows (เริ่มแรกเปลี่ยนเป็น 0 จากนั้นเป็น 1,000 เป็นแบบทดสอบ) ซึ่งอยู่ที่

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\14.0\Access Connectivity Engine\Engines\Excel

เหตุผลที่ฉันคิดว่าเป็นเพราะไฟล์ต่างๆ ที่นำเข้าโดยทั่วไปมีข้อมูลเดียวกัน แต่ดูเหมือนว่าหากคอลัมน์สองสามแถวแรกในข้อมูลต้นฉบับมีเพียงตัวเลขเท่านั้น ข้อมูลที่มีค่าผสมจะไม่ถูกนำเข้าอย่างถูกต้อง . คอลัมน์อื่นๆ ทั้งหมดนอกเหนือจากนี้ดูเหมือนว่าจะใช้ได้

เมื่อดูไฟล์ต้นฉบับแล้ว ทั้งหมดจะมีประเภทข้อมูลเหมือนกัน ฉันได้ลองเปลี่ยนค่ารีจิสทรี TypeGuessRows และตรวจสอบให้แน่ใจว่าคุณสมบัติของคอลัมน์เอาต์พุตเป็นแบบสตริงแทนที่จะเป็นตัวเลข สตริงการเชื่อมต่อมี IMEX=1


person J. Sutton    schedule 29.05.2019    source แหล่งที่มา


คำตอบ (2)


ดังนั้นฉันจึงแก้ไขมัน หรืออย่างน้อยก็พบวิธีแก้ปัญหาที่เพียงพอซึ่งจะช่วยใครก็ตามที่อยู่ในสถานการณ์ของฉันได้ ฉันคิดว่าเกี่ยวข้องกับแคชของ SSIS ฉันลงเอยด้วยการวางฟังก์ชันการเรียงลำดับในคอลัมน์ปัญหา ดังนั้นบันทึกที่ถูกอ่านเป็น NULL สำหรับการมีประเภทข้อมูลแบบสุ่มจะถูกอ่านก่อน และไม่ถือว่าเป็นการสุ่ม ฉันจะบอกว่า ฉันลองวิธีนี้ตั้งแต่แรกแล้วแต่มันไม่ได้ผล จากการทดลองเล็กๆ น้อยๆ ในการสร้างโฟลว์ข้อมูลใหม่ในแพ็คเกจเดียวกัน ฉันพบว่าโซลูชันนี้ใช้งานได้จริง ดังนั้นฉันจึงคิดถึงแคช เป็นปัญหา หากใครมีคำถามเพิ่มเติมเกี่ยวกับเรื่องนี้ โปรดแจ้งให้เราทราบ

person J. Sutton    schedule 06.06.2019
comment
ฉันกำลังเผชิญกับปัญหาเดียวกัน โปรดระบุแนวทางในการสมัคร - person giparekh; 28.07.2020

ปัญหานี้เกี่ยวข้องกับผู้ให้บริการ OLEDB ที่ใช้ในการอ่านไฟล์ Excel: เนื่องจาก Excel ไม่ใช่ฐานข้อมูลที่แต่ละคอลัมน์มีประเภทข้อมูลเฉพาะ ผู้ให้บริการ OLEDB จะพยายามระบุประเภทข้อมูลหลักที่พบในแต่ละคอลัมน์และแทนที่ประเภทข้อมูลอื่น ๆ ทั้งหมดที่ไม่สามารถทำได้ แยกวิเคราะห์ด้วย NULL

มีบทความมากมายที่พบทางออนไลน์ที่พูดคุยเกี่ยวกับปัญหานี้และให้วิธีแก้ปัญหาหลายอย่าง (ลิงก์ที่แสดงด้านล่าง)

แต่หลังจากใช้ SSIS มาหลายปี ฉันสามารถพูดได้ว่า แนวปฏิบัติที่ดีที่สุดคือการแปลงไฟล์ Excel เป็นไฟล์ CSV และอ่านโดยใช้ส่วนประกอบ Flat File

หรือหากคุณไม่มีทางเลือกในการแปลงไฟล์ Excel เป็นไฟล์แฟลต คุณสามารถบังคับให้ตัวจัดการการเชื่อมต่อ Excel ละเว้นส่วนหัวจากแถวแรก bu โดยเพิ่ม HDR=NO ลงในสตริงการเชื่อมต่อและเพิ่ม IMEX=1 เพื่อแจ้งให้ผู้ให้บริการ OLEDB ระบุประเภทข้อมูลจาก แถวแรก (ซึ่งเป็นส่วนหัว - สตริงทั้งหมดเป็นส่วนใหญ่) ในกรณีนี้ คอลัมน์ทั้งหมดจะถูกนำเข้าเป็นสตริงและไม่มีค่าใดที่จะแทนที่ด้วย NULL แต่คุณจะสูญเสียส่วนหัวและแถวเพิ่มเติม (นำเข้าแถวส่วนหัวแล้ว)

หากคุณไม่สามารถเพิกเฉยต่อแถวส่วนหัวได้ เพียงเพิ่มแถวจำลองที่มีค่าสตริงจำลอง (ตัวอย่าง: aaa) หลังแถวส่วนหัว และเพิ่ม IMEX=1 ลงในสตริงการเชื่อมต่อ

ลิงก์ที่เป็นประโยชน์

person Hadi    schedule 30.05.2019
comment
สวัสดี ขอบคุณสำหรับการตอบกลับ แต่ฉันไม่สามารถเปลี่ยนแหล่งข้อมูลได้ HDR ถูกตั้งค่าเป็น NO แล้ว เนื่องจากปัญหาที่ไม่เกี่ยวข้อง ฉันไม่คิดว่ามันจะเกี่ยวข้องกับปัญหานี้ ดังนั้นฉันจึงไม่ได้พูดถึงมันในโพสต์ นอกจากนี้ ตามโพสต์เริ่มต้น IMEX=1 ได้ถูกตั้งค่าไว้แล้ว ฉันได้อ่านลิงก์สองสามลิงก์ที่คุณให้ไว้ก่อนที่จะโพสต์คำถามนี้ และในการอ่านส่วนที่เหลือ ดูเหมือนว่าพวกเขากำลังแนะนำรูปแบบต่างๆ ของ IMEX=1 และ/หรือเปลี่ยนรีจิสทรีเพื่อให้แน่ใจว่า TypeGuessRows เป็น 0 รวมถึงการตรวจสอบประเภทข้อมูลทั้งหมดที่ฉันกล่าวถึงในโพสต์ของฉันว่าทำไปแล้ว - person J. Sutton; 30.05.2019