ฉันสามารถสอบถามไฟล์ที่คั่นด้วยแท็บจาก SSMS ได้หรือไม่


14

เป็นไปได้หรือไม่ที่จะสืบค้นไฟล์ที่คั่นด้วยแท็บจาก Sql Server Management Studio เพื่อดูข้อมูลโดยไม่บันทึกที่ใดก็ได้

ฉันรู้ว่าคุณสามารถBULK INSERTจากไฟล์ที่คั่นด้วยแท็บโดยใช้สิ่งที่ชอบ:

BULK INSERT SomeTable
FROM 'MyFile.txt'
WITH (
FIELDTERMINATOR = '\t',
ROWTERMINATOR = '\n');

อย่างไรก็ตามคุณต้องทราบคอลัมน์ล่วงหน้าและสร้างตารางเพื่อเก็บข้อมูล

ฉันรู้ว่าคุณสามารถสืบค้นไฟล์ประเภทอื่นเช่น CSV หรือ Excel ได้โดยไม่ต้องกำหนดคอลัมน์ล่วงหน้าโดยใช้OPENROWSETและไดรเวอร์ Excel เช่น:

-- Query CSV
SELECT * 
FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 
    'Text;Database=\\Server\Folder\;HDR=Yes;', 
    'SELECT * FROM MyFile.csv')

-- Query Excel
SELECT *
FROM OPENROWSET('Microsoft.Ace.OLEDB.12.0', 
    'Excel 8.0;Database=MyFile.xls', 
    'SELECT * FROM [Sheet1$]')

นอกจากนี้ถ้าฉันจะเปลี่ยนคีย์รีจิสทรีFormatภายใต้การHKLM\Software\Microsoft\Office\12.0\Access Connectivity Engine\Engines\TextจากCSVDelimitedไปTabDelimitedใน SQL Server แบบสอบถาม CSV ข้างต้นจะถูกต้องอ่านแฟ้มข้อความที่คั่นด้วยแท็บ แต่มันจะไม่อ่านไฟล์ข้อความที่คั่นด้วยจุลภาคดังนั้นผมจึงไม่คิดว่าฉันต้องการ ทิ้งไว้เช่นนั้น

ความพยายามที่จะใช้Format=TabDelimitedในการOPENROWSETไม่ทำงานอย่างใดอย่างหนึ่ง

SELECT * 
FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 
    'Text;Database=\\Server\Folder\;HDR=Yes;Format=TabDelimited', 
    'SELECT * FROM MyFile.txt')

ฉันได้พยายามคัดลอกTextรีจิสตรีคีย์จากทั้งสองEnginesและISAM Formatsคีย์ไปยังสิ่งที่กำหนดเองที่เป็นค่าเริ่มต้นTabDelimitedอย่างไรก็ตามยังคงอ่านไฟล์ด้วยCSVFormatแทนที่จะเป็นTabDelimitedรูปแบบดังนั้นฉันต้องพลาดบางสิ่งที่นี่

มีวิธีสืบค้นไฟล์คั่นด้วยแท็บเพื่อดูเนื้อหาโดยไม่ต้องสร้างตารางBULK INSERTหรือไม่

ฉันใช้ SQL Server 2005


เป็นที่ยอมรับหรือไม่ที่จะใช้ตารางชั่วคราวที่สร้างขึ้นแบบไดนามิกซึ่งถูกลบทิ้งหลังการใช้งาน?
jcolebrand

คำถามที่สอง: คุณลองใช้ไดรเวอร์ Excel เพื่อเปิด TDF หรือไม่ บางครั้ง Excel มีมนต์ขลัง
jcolebrand

@ jcolebrand ใช่ฉันสามารถใช้ตาราง temp ได้ แต่รายการคอลัมน์ค่อนข้างยาวและอาจมีการเปลี่ยนแปลงดังนั้นฉันจึงค่อนข้างสามารถระบุเฉพาะคอลัมน์ที่ฉันสนใจแทนที่จะต้องเขียนคำจำกัดความสำหรับพวกเขาทั้งหมด และจำได้ว่าต้องอัปเดตทุกครั้งที่มีการเปลี่ยนแปลงคอลัมน์ที่ไม่จำเป็น
Rachel

@ jcolebrand ฉันไม่เคยคิดที่จะลองไดรเวอร์ excel แม้ว่ามันจะไม่ได้ดูมีแนวโน้มตอนนี้ นามสกุลไฟล์นั้นจริง ๆ แล้ว.bakไม่ใช่ส่วนขยายไฟล์แบบมีตัวคั่นปกติและข้อผิดพลาดที่ให้กับฉันในการลองครั้งแรกของฉันคือCould not find installable ISAMดังนั้นฉันไม่คิดว่ามันจะทำงานได้
Rachel

2
ฉันจะแยกวิเคราะห์รายการคอลัมน์ในทันทีจากไฟล์ในแต่ละครั้ง (เพียงทำแท็บ countof ในบรรทัดแรกของไฟล์) แทนที่จะพยายามติดตามจำนวนคอลัมน์ที่จำเป็นสำหรับการนำเข้าดังนั้นตารางชั่วคราวที่สร้างขึ้นแบบไดนามิก . อย่าใช้รหัสยากในสิ่งที่คุณสามารถทำวิศวกรรมย้อนกลับจากข้อมูลในความคิดของฉัน
jcolebrand

คำตอบ:


13

คุณต้องสร้างไฟล์ schema.ini ที่มีตัวคั่นในไดเรกทอรีเดียวกันกับไฟล์ข้อความที่คุณกำลังเปิด นี่เป็นวิธีเดียวที่จะแทนที่ค่ารีจิสตรีบนพื้นฐานต่อไฟล์ โปรดดูเอกสารในรูปแบบไฟล์บนMSDN ตัวอย่าง:

SELECT * 
FROM OPENROWSET(
    'Microsoft.ACE.OLEDB.12.0', 
    'Text; HDR=YES; Database=C:\Text', 
    'SELECT * FROM testupload2.txt')

ใน C: \ Text \ schema.ini:

[testupload2.txt]
ColNameHeader=True
Format=TabDelimited
MaxScanRows=0

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


ขอบคุณมาก! ฉันได้เห็นคำแนะนำในการใช้ไฟล์ schema.ini แต่ฉันมีปัญหาในการหาวิธีการใช้งานด้วยตัวเอง
Rachel

ฉันรู้ว่านี่เป็นโพสต์เก่า แต่ฉันต้องพูดว่า "Nice Job" @dartonw
Jeff Moden
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.