ส่งออกผลลัพธ์แบบสอบถามไปยังไฟล์. csv ใน SQL Server 2008


141

ฉันจะส่งออกผลลัพธ์แบบสอบถามไปยังไฟล์. csv ใน SQL Server 2008 ได้อย่างไร



คุณต้องการตัวคั่นหนีหรือไม่? คำตอบส่วนใหญ่คิดว่าคุณทำไม่ได้ซึ่งไม่ใช่ทั้งหมดที่ CSV
Nick

@Nick - โดยทั่วไปตัวคั่นจะอยู่ในสตริงเท่านั้นและโดยทั่วไปจะมีเครื่องหมายคำพูดล้อมรอบ ดูคำตอบของฉันเพื่อดูวิธีแก้ปัญหานี้ stackoverflow.com/questions/6115054/…
MacGyver


บางครั้งฉันใช้ Python
LV98

คำตอบ:


168
  1. เปิด Studio จัดการเซิร์ฟเวอร์ SQL
  2. ไปที่เครื่องมือ> ตัวเลือก> ผลลัพธ์ของแบบสอบถาม> SQL Server> Results To Text
  3. ที่ด้านขวาสุดจะมีช่องดรอปดาวน์ชื่อรูปแบบเอาท์พุท
  4. เลือกคั่นด้วยเครื่องหมายจุลภาคและคลิกตกลง

นี่เป็นเวอร์ชันเต็มของภาพด้านล่าง

ป้อนคำอธิบายรูปภาพที่นี่

นี่จะแสดงผลลัพธ์การสืบค้นของคุณเป็นข้อความที่คั่นด้วยจุลภาค

หากต้องการบันทึกผลลัพธ์ของแบบสอบถามลงในไฟล์: Ctrl + Shift + F


10
คำตอบคือทำให้เข้าใจผิดเล็กน้อย ... เมื่อคุณกดCtrl+Shift+Fจะเปลี่ยนเฉพาะโหมดเอาต์พุตเท่านั้นจะไม่มีผลต่อผลลัพธ์หากคุณเรียกใช้คิวรีแล้ว เพื่อให้สิ่งนี้สะท้อนออกมาคุณต้องเรียกใช้แบบสอบถามอีกครั้ง เมื่อคุณรันในโหมด "Results to File" มันควรจะพร้อมท์ให้คุณทราบว่าคุณต้องการบันทึกผลลัพธ์ไว้ที่ไหน
qJake

3
ควรไปที่เครื่องมือ> ตัวเลือก> ผลลัพธ์ของแบบสอบถาม> SQL Server > ผลลัพธ์เป็นข้อความ
congusbongus

45
เรียกใช้แบบสอบถามอีกครั้งไม่เพียงพอสำหรับฉัน ฉันต้องปิดหน้าต่างแบบสอบถามเปิดใหม่แล้วเรียกใช้แบบสอบถามอีกครั้ง
Breandán

3
ยืนยันความคิดเห็น @ Breandán การตั้งค่าใหม่จะไม่ใช้กับหน้าต่างแบบสอบถามที่เปิดอยู่ในปัจจุบันต้องปิดและเรียกใช้แบบสอบถามอีกครั้ง
Shinigamae

3
สิ่งหนึ่งที่ฉันต้องทำคือส่งออกเป็นส่วนขยาย RPT เริ่มต้น หลังจากทำเช่นนั้นคุณสามารถเปลี่ยนชื่อเป็น CSV และใช้งานได้
Thomas Bennett

140

ฉันรู้ว่ามันค่อนข้างเก่า แต่นี่เป็นวิธีที่ง่ายกว่ามาก ...

  1. เรียกใช้คิวรีของคุณด้วยการตั้งค่าเริ่มต้น (กำหนดผลลัพธ์ในรูปแบบกริดหากรายการของคุณไม่อยู่ในรูปแบบกริดดูด้านล่าง)

  2. คลิกขวาที่ผลลัพธ์ของกริดและคลิก "บันทึกผลลัพธ์เป็น" และบันทึก

หากผลลัพธ์ของคุณไม่อยู่ในรูปแบบกริดให้คลิกขวาที่ตำแหน่งที่คุณเขียนแบบสอบถามวางตัว "Results To" แล้วคลิก "Results To Grid"

ระวังให้ดีอย่าจับหัวคอลัมน์!

โชคดี!


1
ปัญหาเดียวก็คือวิธีนี้ดูเหมือนจะไม่ให้คุณตั้งค่าตัวเลือกใด ๆ ตัวอย่างเช่น NULL ทั้งหมดแสดงในไฟล์ที่ส่งออกเป็น "NULL" ฯลฯ อาจมีวิธีตั้งค่าที่ฉันไม่ทราบ
โนอาห์

13
น่าอัศจรรย์แม้ใน SSMS 2012 สิ่งนี้ไม่ได้อ้างข้อความอย่างถูกต้องสำหรับ CSV ควรใส่เครื่องหมายจุลภาคหรือบรรทัดใหม่ภายใน CHAR / VARCHAR แต่ไม่ใช่ ที่ทำให้ข้อมูลเปลี่ยนเป็นคอลัมน์ใหม่หรือเปลี่ยนเป็นบรรทัดใหม่
Eric J.

4
ยังไม่ให้ส่วนหัวคอลัมน์กับคุณ
ดอน

8
@ Don สิ่งนี้จะให้ส่วนหัวของคอลัมน์ถ้าคุณไปที่ "Query" -> "Query Options ... ", แท็บกริดและตรวจสอบ "รวมส่วนหัวของคอลัมน์เมื่อคัดลอกหรือบันทึกผลลัพธ์"
Rob Wise

7
นี่ควรเป็นคำตอบ
pspahn

46

คุณสามารถใช้ PowerShell

$AttachmentPath = "CV File location"
$QueryFmt= "Query"

Invoke-Sqlcmd -ServerInstance Server -Database DBName -Query $QueryFmt | Export-CSV $AttachmentPath

ขอบคุณ! นี่เป็นข้อเสนอแนะเดียวที่เหมาะกับฉัน จัดการกับการหลบหนีอย่างถูกต้อง
emertechie

3
+10 ถ้าทำได้ เฉพาะคำตอบที่จัดการการหลบหนี จะได้รับนี้ในการทำงานผมต้องเพิ่มสองบรรทัดที่ด้านบนของสคริปต์: และAdd-PSSnapin SqlServerCmdletSnapin100 Add-PSSnapin SqlServerProviderSnapin100
Eric J.

หากคุณประสบหมดเวลาเพิ่มQueryTimeout ดังนั้นเช่นInvoke-Sqlcmd -ServerInstance MySQLserver123 -Query $QueryFmt -querytimeout 600 | Export-CSV $AttachmentPath
Tilo

1
ในฐานะที่เป็นมือใหม่ Powershell ฉันจำเป็นต้องติดตั้งโมดูล SqlServer: Install-Module -Name SqlServer(แต่ไม่จำเป็นต้อง snap ใน Cmdlets เหล่านั้น) Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope CurrentUserนอกจากนี้ผมต้องการบันทึกคำสั่งในสคริปต์ซึ่งจะไม่ทำงานจนกว่าฉันจะเปลี่ยนแปลงนโยบายการดำเนินการ:
sandyscott

@sandyscott ฉันเป็นมือใหม่ Powershell เช่นกันดังนั้นขอบคุณ อย่างไรก็ตามฉันคิดว่าในกรณีนี้RemoteSignedนโยบายการดำเนินการจะเพียงพอ
BigBother

14

หากฐานข้อมูลที่เป็นปัญหาในท้องถิ่นข้อมูลต่อไปนี้อาจเป็นวิธีที่มีประสิทธิภาพที่สุดในการส่งออกผลลัพธ์แบบสอบถามไปยังไฟล์ CSV (นั่นคือช่วยให้คุณควบคุมได้มากที่สุด)

  1. คัดลอกแบบสอบถาม
  2. ใน Object Explorer คลิกขวาที่ฐานข้อมูลที่เป็นปัญหา
  3. เลือก "Tasks" >> "ส่งออกข้อมูล ... "
  4. กำหนดค่าแหล่งข้อมูลของคุณแล้วคลิก "ถัดไป"
  5. เลือก "ไฟล์แฟลต" หรือ "Microsoft Excel" เป็นปลายทาง
  6. ระบุพา ธ ไฟล์
  7. หากทำงานกับไฟล์ flat ให้กำหนดค่าตามต้องการ หากทำงานกับ Microsoft Excel ให้เลือก "Excel 2007" (เวอร์ชันก่อนหน้ามีขีด จำกัด แถวที่ 64k)
  8. เลือก "เขียนแบบสอบถามเพื่อระบุข้อมูลที่จะถ่ายโอน"
  9. วางแบบสอบถามจากขั้นตอนที่ 1
  10. คลิกถัดไป >> ตรวจสอบการแมป >> คลิกถัดไป >> เลือก "เรียกใช้ทันที" >> คลิก "เสร็จสิ้น" สองครั้ง

หลังจากผ่านกระบวนการนี้อย่างละเอียดถี่ถ้วนฉันพบว่าสิ่งต่อไปนี้เป็นตัวเลือกที่ดีที่สุด

สคริปต์ PowerShell

$dbname = "**YOUR_DB_NAME_WITHOUT_STARS**"
$AttachmentPath = "c:\\export.csv"
$QueryFmt= @"
**YOUR_QUERY_WITHOUT_STARS**
"@

Invoke-Sqlcmd   -ServerInstance **SERVER_NAME_WITHOUT_STARS** -Database  $dbname -Query $QueryFmt | Export-CSV $AttachmentPath -NoTypeInformation

เรียกใช้ PowerShell ในฐานะผู้ดูแลระบบ

& "c:\path_to_your_ps1_file.ps1"

1
หากคุณประสบหมดเวลาเพิ่มQueryTimeout ดังนั้นเช่นInvoke-Sqlcmd -ServerInstance MySQLserver123 -Query $QueryFmt -querytimeout 600 | Export-CSV $AttachmentPath
Tilo

6

MS Excel -> ข้อมูล -> แบบสอบถามใหม่ -> จากฐานข้อมูล .. ทำตามขั้นตอน


6

จากคำตอบของ NS ฉันมีสคริปต์ PowerShell ที่ส่งออกไปยังไฟล์ CSVโดยมีเครื่องหมายคำพูดล้อมรอบฟิลด์และคั่นด้วยเครื่องหมายจุลภาคและจะข้ามข้อมูลส่วนหัวในไฟล์

add-pssnapin sqlserverprovidersnapin100
add-pssnapin sqlservercmdletsnapin100

$qry = @"
Select
  *
From
 tablename
"@

Invoke-Sqlcmd -ServerInstance Server -Database DBName -Query $qry | convertto-CSV -notype | select -skip 1  > "full path and filename.csv"

สองบรรทัดแรกเปิดใช้งานความสามารถในการใช้คำสั่งInvoke-SqlCmd


6

ใช้T-SQL :

INSERT INTO OPENROWSET('Microsoft.ACE.OLEDB.12.0','Text;Database=D:\;HDR=YES;FMT=Delimited','SELECT * FROM [FileName.csv]')
SELECT Field1, Field2, Field3 FROM DatabaseName

แต่มีข้อแม้อยู่สองสามข้อ:

  1. คุณต้องมีผู้ให้บริการ Microsoft.ACE.OLEDB.12.0 ผู้ให้บริการ Jet 4.0 ก็ใช้งานได้เหมือนกัน แต่มันเก่าแก่ดังนั้นฉันจึงใช้มันแทน

  2. ไฟล์. CSV จะต้องมีอยู่แล้ว หากคุณใช้ส่วนหัว ( HDR=YES) ตรวจสอบให้แน่ใจว่าบรรทัดแรกของไฟล์. CSV เป็นรายการที่คั่นด้วยฟิลด์ทั้งหมด


3

การใช้เทคนิค Studio จัดการเซิร์ฟเวอร์ SQL ดั้งเดิมเพื่อส่งออกเป็น CSV (ตามที่แนะนำ @ 8kb) จะไม่ทำงานหากค่าของคุณมีเครื่องหมายจุลภาคเนื่องจาก SSMS ไม่ตัดค่าในเครื่องหมายคำพูดคู่ วิธีที่มีประสิทธิภาพมากขึ้นสำหรับฉันก็คือคัดลอกผลลัพธ์ (คลิกภายในตารางจากนั้นกด CTRL-A, CTRL-C) แล้ววางลงใน Excel จากนั้นบันทึกเป็นไฟล์ CSV จาก Excel


2

คุณสามารถใช้ QueryToDoc ( http://www.querytodoc.com ) มันช่วยให้คุณเขียนแบบสอบถามกับฐานข้อมูล SQL และส่งออกผลลัพธ์ - หลังจากที่คุณเลือกตัวคั่น - ไปยัง Excel, Word, HTML หรือ CSV


2
INSERT INTO OPENROWSET('Microsoft.ACE.OLEDB.12.0','Text;Database=D:\;HDR=YES;FMT=Delimited','SELECT * FROM [FileName.csv]')
SELECT Field1, Field2, Field3 FROM DatabaseName

เป็น @Slogmeister Extraordinaire Quoted ถูกต้อง

จำเป็นต้องมี 1> ไฟล์มีอยู่แล้วในคอลัมน์ 2> จำเป็นต้องติดตั้ง Office

พบข้อผิดพลาด

1

ข่าวสารเกี่ยวกับ 7303 ระดับ 16 สถานะ 1 บรรทัด 1 ไม่สามารถเริ่มต้นวัตถุแหล่งข้อมูลของผู้ให้บริการ OLE DB "Microsoft.ACE.OLEDB.12.0" สำหรับเซิร์ฟเวอร์ที่เชื่อมโยง "(null)"

64 บิต http://download.microsoft.com/download/2/4/3/24375141-E08D-4803-AB0E-10F2E3A07AAA/AccessDatabaseEngine_x64.exe

32 บิตhttp://download.microsoft.com/download/f/d/8/fd8c20d8-e38a-48b6-8691-542403b91da1/AccessDatabaseEngine.exeแบบ 32 บิต

2

ข่าวสารเกี่ยวกับ 15281 ระดับ 16 สถานะ 1 สาย 1 SQL Server บล็อกการเข้าถึงงบ 'OpenRowset / OpenDatasource' ของคอมโพเนนต์ 'Ad Hoc Distributed Queries' เนื่องจากคอมโพเนนต์นี้ถูกปิดเป็นส่วนหนึ่งของการกำหนดค่าความปลอดภัยสำหรับเซิร์ฟเวอร์นี้ ผู้ดูแลระบบสามารถเปิดใช้งาน 'การค้นหาแบบกระจายเฉพาะกิจ' โดยใช้ sp_configure สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการเปิดใช้งาน 'แบบสอบถามแบบกระจาย Ad Hoc' ค้นหา 'แบบสอบถามแบบกระจายแบบเฉพาะกิจ' ใน SQL Server Books Online

EXEC sp_configure 'show advanced options', 1
RECONFIGURE
GO
EXEC sp_configure 'ad hoc distributed queries', 0
RECONFIGURE
GO

2

หากคุณไม่ต้องการใช้ Powershell คำตอบนี้เป็นคำตอบที่ยอดเยี่ยมของ 8kb ข้อแตกต่างเพียงอย่างเดียวคือแทนที่จะเลือก CSV เป็นรูปแบบผลลัพธ์ให้เลือก Tab Delimited วิธีนี้ถ้ามีเครื่องหมายจุลภาคในข้อมูลของคุณมันจะไม่ข้ามเซลล์ใน Excel นอกจากนี้หากคุณตั้งค่าตัวคั่นเริ่มต้นของ Excel เป็นแท็บคุณสามารถทำสำเนาผลการสืบค้น SSMS ทั้งหมด (CTRL-A, CTRL-C) และวางลงใน Excel (ไม่จำเป็นต้องบันทึกเป็นไฟล์และนำเข้าไปยัง Excel ):

  • ใน SSMS ไปที่เครื่องมือ> ตัวเลือก> ผลลัพธ์การค้นหา> SQL Server> Results To Text
  • เปลี่ยนรูปแบบผลลัพธ์ทางด้านขวาสุดเป็นTab Delimited
  • คลิกตกลง

ตอนนี้คุณสามารถดำเนินการค้นหาของคุณจากนั้นทำ CTRL-A เพื่อเลือกผลลัพธ์ทั้งหมดแล้วกด CTRL-C เพื่อคัดลอกไปยังคลิปบอร์ดแล้วเปลี่ยนไปใช้ Excel 2013 (อาจใช้งานได้ในปี 2007 เช่นกันไม่แน่ใจ) และวาง - สมมติว่าเป็นค่าเริ่มต้นของ Excel ตัวคั่นถูกตั้งค่าเป็นแท็บ

ภาพหน้าจอตัวเลือกการค้นหา SSMS


-1

ใช่สิ่งเหล่านี้เป็นไปได้เมื่อคุณมีการเข้าถึงเซิร์ฟเวอร์โดยตรง แต่ถ้าคุณมีสิทธิ์เข้าถึงเซิร์ฟเวอร์จากเว็บ / แอพพลิเคชันเซิร์ฟเวอร์เท่านั้น สถานการณ์เป็นแบบนี้กับพวกเรามานานแล้วและทางออกก็คือ SQL Server ส่งออกเป็น CSV


ลิงก์ ... การเข้าถึงถูกปฏิเสธ?
hoggar
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.