Sqlcmd का उपयोग करके SQL सर्वर से CSV प्रारूप के रूप में डेटा कैसे निर्यात करें?


136

मैं एक पाठ फ़ाइल में डेटा को आसानी से डंप कर सकता हूं जैसे:

sqlcmd -S myServer -d myDB -E -Q "select col1, col2, col3 from SomeTable" 
     -o "MyData.txt"

हालाँकि, मैंने मदद फ़ाइलों के लिए SQLCMDदेखा है लेकिन विशेष रूप से CSV के लिए कोई विकल्प नहीं देखा है।

वहाँ एक सीएसवी पाठ फ़ाइल का उपयोग कर एक मेज से डेटा डंप करने का एक तरीका है SQLCMD?


इस sqlcmd के माध्यम से होनी चाहिए, या आप जैसे कि निम्न अन्य प्रोग्राम का उपयोग कर सकते हैं: codeproject.com/KB/aspnet/ImportExportCSV.aspx
बर्नहार्ड Hofmann

यह होना जरूरी नहीं है, लेकिन मैं निश्चित रूप से जानना चाहता था कि sqlcmd वास्तव में कुछ अन्य निर्यात उपयोगिता में गोता लगाने से पहले ऐसा कर सकता है या नहीं। एक बात का उल्लेख है कि यह करने के लिए पटकथा की जरूरत है।
रे

एक SSMS 2008 एडिन टूल है जो आपके टेबल से CSV आउटपुट करता है जिसे क्लाज द्वारा कहां और ऑर्डर द्वारा अनुकूलित किया जा सकता है। store.nmally.com/software/sql-server-management-studio-addons/…

जवाबों:


140

आप कुछ इस तरह से चला सकते हैं:

sqlcmd -S MyServer -d myDB -E -Q "select col1, col2, col3 from SomeTable" 
       -o "MyData.csv" -h-1 -s"," -w 700
  • -h-1 परिणाम से कॉलम नाम हेडर निकालता है
  • -s"," कॉलम सेपरेटर को सेट करता है,
  • -w 700 पंक्ति की चौड़ाई 700 वर्णों तक सेट करता है (इसे सबसे लंबी पंक्ति के रूप में चौड़ा करना होगा या यह अगली पंक्ति में लिपट जाएगा)

22
इसे इस तरह से करने का मतलब यह है कि आपके डेटा में कोई अल्पविराम नहीं हो सकता है।
सेरेल बोथा

1
@ सरबेलथा, आप उस समस्या के साथ जुड़ सकते हैं '""' + col1 + '""' AS col1, जिसमें (डबल) डबल कोट्स में लिपटे हुए या केवल एक संग्रहीत प्रक्रिया को कॉल कर सकते हैं।
मिस्टरइसाक

2
@JIsaak फिर सुनिश्चित करें कि आपके डेटा में कोई भी दोहरे उद्धरण चिह्न नहीं हैं या अपने दोहरे उद्धरण चिह्नों को दो दोहरे उद्धरणों से बदलना सुनिश्चित करें।
सेरेल बोथा

1
क्या कोई स्पष्ट कर सकता है कि डेटा के अंदर कॉमा को अनुमति देने के लिए क्या किया जाना है? क्या हमें हर कॉलम को "" + '___ +' '' '' से घेरना है?
अहमद

2
यह उत्तर अब पुराना हो चुका है। पॉवरशेल स्क्रिप्ट अधिक लचीली होती हैं और इसे जॉब एजेंट के रूप में SQL सर्वर में चलाया जा सकता है।
क्लिंटन वार्ड

75

PowerShell के साथ आप Invoke-Sqlcmd को Export-Csv में पाइप करके समस्या को बड़े करीने से हल कर सकते हैं।

#Requires -Module SqlServer
Invoke-Sqlcmd -Query "SELECT * FROM DimDate;" `
              -Database AdventureWorksDW2012 `
              -Server localhost |
Export-Csv -NoTypeInformation `
           -Path "DimDate.csv" `
           -Encoding UTF8

SQL सर्वर 2016 में SqlServer मॉड्यूल शामिल है Invoke-Sqlcmd, जिसमें cmdlet शामिल है , जो आपके पास सिर्फ SSMS 2016 स्थापित होने पर भी होगा। इससे पहले, SQL Server 2012 में पुराने SQLPS मॉड्यूल शामिल थे , जो वर्तमान निर्देशिका को SQLSERVER:\तब बदल देगा जब मॉड्यूल था पहले (अन्य बग्स के बीच) इसके लिए इस्तेमाल किया गया था, आपको #Requiresऊपर दी गई लाइन को बदलना होगा :

Push-Location $PWD
Import-Module -Name SQLPS
# dummy query to catch initial surprise directory change
Invoke-Sqlcmd -Query "SELECT 1" `
              -Database  AdventureWorksDW2012 `
              -Server localhost |Out-Null
Pop-Location
# actual Invoke-Sqlcmd |Export-Csv pipeline

SQL Server 2008 और 2008 R2 के लिए उदाहरण को अनुकूलित करने के लिए, #Requiresलाइन को पूरी तरह से हटा दें और मानक PowerShell होस्ट के बजाय sqlps.exe सुविधा का उपयोग करें ।

Invoke-Sqlcmd sqlcmd.exe के पॉवरशेल के बराबर है। पाठ के बजाय यह System.Data.DataRow वस्तुओं को आउटपुट करता है।

-Queryपैरामीटर की तरह काम करता -Qsqlcmd.exe के पैरामीटर। इसे SQL क्वेरी पास करें जो उस डेटा का वर्णन करती है जिसे आप निर्यात करना चाहते हैं।

-Databaseपैरामीटर की तरह काम करता -dsqlcmd.exe के पैरामीटर। इसे उस डेटाबेस का नाम दें जिसमें निर्यात किया जाने वाला डेटा है।

-Serverपैरामीटर की तरह काम करता -Ssqlcmd.exe के पैरामीटर। इसे उस सर्वर का नाम दें जिसमें निर्यात किया जाने वाला डेटा है।

Export-CSV एक PowerShell cmdlet है जो CSV में सामान्य वस्तुओं को क्रमबद्ध करता है। यह PowerShell के साथ जहाज करता है।

-NoTypeInformationपैरामीटर अतिरिक्त उत्पादन है कि सीएसवी प्रारूप का हिस्सा नहीं है दबा देता है। डिफ़ॉल्ट रूप से cmdlet एक हेडर टाइप जानकारी के साथ लिखता है। यह आपको उस वस्तु के प्रकार को जानने देता है जब आप इसे बाद में इसके साथ डिसेर्बलाइज करते हैं Import-Csv, लेकिन यह उन टूल्स को भ्रमित करता है जो मानक CSV की अपेक्षा करते हैं।

-Pathपैरामीटर की तरह काम करता -osqlcmd.exe के पैरामीटर। यदि आप पुराने SQLPS मॉड्यूल का उपयोग कर रहे हैं, तो इस मान के लिए एक पूर्ण पथ सबसे सुरक्षित है ।

-Encodingपैरामीटर की तरह काम करता -fया -usqlcmd.exe के मापदंडों। डिफ़ॉल्ट रूप से Export-Csv केवल ASCII वर्णों को आउटपुट करता है और अन्य सभी को प्रश्नवाचक चिन्ह से बदल देता है। सभी वर्णों को संरक्षित करने और अधिकांश अन्य उपकरणों के साथ संगत रहने के बजाय UTF8 का उपयोग करें।

Sqlcmd.exe या bcp.exe पर इस समाधान का मुख्य लाभ यह है कि आपको मान्य CSV आउटपुट के लिए कमांड को हैक करने की आवश्यकता नहीं है। निर्यात-सीएसवी cmdlet यह सब आपके लिए संभालता है।

मुख्य नुकसान यह है कि Invoke-Sqlcmdपाइपलाइन के साथ गुजरने से पहले पूरे परिणाम सेट को पढ़ता है। सुनिश्चित करें कि आपके पास उस संपूर्ण परिणाम के लिए पर्याप्त मेमोरी है जिसे आप निर्यात करना चाहते हैं।

यह अरबों पंक्तियों के लिए आसानी से काम नहीं कर सकता है। यदि यह समस्या है, तो आप अन्य टूल आज़मा सकते हैं, या System.Data.SqlClient.SqlDataReader वर्ग का Invoke-Sqlcmdउपयोग करके अपने स्वयं के कुशल संस्करण को रोल कर सकते हैं ।


5
अन्य उत्तर ईमानदारी से चूसना, यह सही तरीके से करने का एकमात्र तरीका है। काश यह अधिक स्पष्ट होता।
शगलेज़

1
SQL 2008 R2 पर, मुझे Invoke-Sqlcmd का उपयोग करने के लिए "sqlps.exe" उपकरण चलाना पड़ा। स्पष्ट रूप से मुझे आयात-मॉड्यूल का उपयोग करने के लिए SQL 2012 की आवश्यकता है? यह "sqlps.exe" के भीतर काम करता है - इस थ्रेड को विवरण के लिए देखें
Mister_Tom

1
@Mister_Tom अच्छी बात है। SQLPS मॉड्यूल SQL 2012 के साथ पेश किया गया था। अब उत्तर बताता है कि पुराने संस्करणों के लिए उदाहरण को कैसे अनुकूलित किया जाए।
इयान सैमुअल मैकलीन एल्डर

1
@JasonMatney PowerShell विंडोज सिस्टम का नया प्रशासनिक इंटरफ़ेस है, लेकिन मानक बनने से पहले SQL सर्वर सलाह का एक बहुत कुछ प्रकाशित किया गया था। प्रचार कीजिये! :-)
इयान सैमुअल मैकलीन एल्डर

1
यह उत्तर उपयोगी जानकारी प्रदान करता है और इस मुद्दे को संभालने के लिए एक शक्तिशाली और लचीला तरीका है, हालांकि यह मूल प्रश्न का उत्तर देने में पूरी तरह से विफल है क्योंकि यह विशेष रूप से पूछा गया था। मैं भी एक शक्तिशाली प्रशंसक हूँ, लेकिन चलो प्रचारवाद को उन्माद में नहीं बदलने देना चाहिए। SQLCMD जल्द ही किसी भी समय दूर नहीं जा रहा है।
बारबेक्यू

69
sqlcmd -S myServer -d myDB -E -o "MyData.txt" ^
    -Q "select bar from foo" ^
    -W -w 999 -s","

अंतिम पंक्ति में CSV- विशिष्ट विकल्प हैं।

  • -W   प्रत्येक व्यक्तिगत क्षेत्र से अनुगामी रिक्त स्थान निकालें
  • -s","   अल्पविराम (,) के लिए स्तंभ विभाजक सेट करता है
  • -w 999   पंक्ति की चौड़ाई 999 वर्णों पर सेट करता है

स्कॉटम का उत्तर मेरे द्वारा उपयोग किए जाने के बहुत करीब है, लेकिन मुझे लगता है कि -Wयह वास्तव में अच्छा है।

MSDN sqlcmd संदर्भ भी देखें । यह /?शर्म करने के लिए विकल्प का आउटपुट डालता है ।


19
@sims ने क्वेरी / inputfile की शुरुआत में "nocount on" सेट किया
d -_- b

7
हेडर्स पर अंडरलाइनिंग को कैसे हटा सकता हूं?
ntombela

@ गुगुलथून: पहली पंक्ति पर कॉलम नाम डालने के लिए आप अपनी क्वेरी में एक यूनियन कर सकते हैं।
नॉर्ड्स

2
यह एक आकर्षण की तरह काम करता है, लेकिन अगर आप कॉलम में सेपरेटर रखते हैं तो मुझे एक भ्रष्ट सीएसवी फ़ाइल मिलती है ...
पीटर

इस टिप्पणी को स्वीकार किए गए उत्तर के रूप में अच्छी तरह से जोड़ा गया है, लेकिन ... आप उस समस्या के साथ '""' + col1 + '""' AS col1जुड़ सकते हैं , जिसमें (दोहरे) दोहरे उद्धरण चिह्नों में लिपटे हुए हैं या बस एक संग्रहीत प्रक्रिया को कॉल कर सकते हैं।
मिस्टरइसाक

59

क्या यह bcpमतलब नहीं था?

bcp "select col1, col2, col3 from database.schema.SomeTable" queryout  "c:\MyData.txt"  -c -t"," -r"\n" -S ServerName -T

सिंटैक्स की जांच करने के लिए इसे अपनी कमांड लाइन से चलाएं।

bcp /?

उदाहरण के लिए:

usage: bcp {dbtable | query} {in | out | queryout | format} datafile
  [-m maxerrors]            [-f formatfile]          [-e errfile]
  [-F firstrow]             [-L lastrow]             [-b batchsize]
  [-n native type]          [-c character type]      [-w wide character type]
  [-N keep non-text native] [-V file format version] [-q quoted identifier]
  [-C code page specifier]  [-t field terminator]    [-r row terminator]
  [-i inputfile]            [-o outfile]             [-a packetsize]
  [-S server name]          [-U username]            [-P password]
  [-T trusted connection]   [-v version]             [-R regional enable]
  [-k keep null values]     [-E keep identity values]
  [-h "load hints"]         [-x generate xml format file]
  [-d database name]

कृपया ध्यान दें कि bcpकॉलम हेडर को आउटपुट नहीं किया जा सकता है।

देखें: bcp उपयोगिता डॉक्स पृष्ठ।

उपरोक्त पृष्ठ से उदाहरण:

bcp.exe MyTable out "D:\data.csv" -T -c -C 65001 -t , ...

1
ServerName = YourcomputerName \ SQLServerName, तभी यह अन्यथा त्रुटि निष्पादित करता है
हम्माद खान

1
यदि आप bcp.exe के लिए पूर्ण दस्तावेज़ देखना चाहते हैं: Technet.microsoft.com/en-us/library/ms162802.aspx
रॉबर्ट बर्नस्टीन

5
यदि आपको कॉलम नामों को हेडर के रूप में अच्छी तरह से निर्यात करने की आवश्यकता है तो आप क्या करते हैं? वहाँ bcp का उपयोग कर एक सीधा सामान्य समाधान है?
इयान सैमुअल मैकलीन एल्डर

@johndacosta बहुत बहुत धन्यवाद। आप कॉलम हेडर को कैसे प्रिंट करेंगे? मैं कहीं भी एक आसान स्विच नहीं देख रहा हूँ। धन्यवाद!
राहेल

1
bcpहेडर (कॉलम नाम) शामिल नहीं करता है, लेकिन यह sqlcmdमेरे अनुभव से ( ~ मेरे अनुभव से) ~ 10X तेज है । वास्तव में बड़े डेटा के लिए, आप डेटा bcpप्राप्त करने के लिए उपयोग कर सकते हैं , और sqlcmdहेडर प्राप्त करने के लिए उपयोग (शीर्ष 0 * से ...) का चयन करें, और फिर उन्हें संयोजित करें।
YJZ

12

ऐसा करने वाले किसी भी व्यक्ति के लिए एक नोट, लेकिन कॉलम हेडर भी है, यह वह समाधान है जो मैंने एक बैच फ़ाइल का उपयोग किया है:

sqlcmd -S servername -U username -P password -d database -Q "set nocount on; set ansi_warnings off; sql query here;" -o output.tmp -s "," -W
type output.tmp | findstr /V \-\,\- > output.csv
del output.tmp

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


1
इसके बजाय निम्नलिखित फ़िल्टर का उपयोग करें: findstr / r / v ^ \ - [, \ -] * $> output.csv किसी कारण के लिए ^ [, \ -] * $ सभी लाइनों से मेल खाता है।
व्लादिमीर कोरोलेव

3
हमेशा डबल उद्धरण के अंदर ^ के साथ एक रेगेक्स रखें, या आपको अजीब परिणाम मिलते हैं, क्योंकि ^ cmd.exe के लिए एक भागने चरित्र है। ऊपर दिए गए दोनों रीजैक्स ठीक से काम नहीं करते हैं, जहां तक ​​मैं बता सकता हूं, लेकिन यह करता है: खोज / आर / वी "^ - [-,] * - $।" ($ से पहले की जरूरत है जब परीक्षण करते समय लगता है। गूंज, लेकिन sqlcmd आउटपुट के लिए नहीं हो सकता है)
जिम

एक के बजाय दिनांक और समय के बीच 2 स्थान होने की तारीखों के साथ एक समस्या भी है। जब आप Excel में CSV खोलने का प्रयास करते हैं, तो यह 00: 00.0 के रूप में दिखाई देता है। इसे हल करने का एक आसान तरीका SED का उपयोग करके सभी "" के साथ "" को खोजना और बदलना होगा। आपकी स्क्रिप्ट में जोड़ने का आदेश होगा: SED -i "s / / / g" output.csv। SED gnuwin32.sourceforge.net/packages/rew.htm
PollusB

यह सही उत्तर है, पूरी तरह से @ जिमजी के साथ काम करता है। मैंने विभाजक के लिए अर्धविराम, और इनपुट के लिए एक sql फ़ाइल का उपयोग किया, फ़ाइल में नॉनकाउंट पर और ansi_warning भाग बंद था, और -W स्विच को अंतरिक्ष से हटाने के लिए
Robotik

1

यह उत्तर @ आईन-बुजुर्ग से समाधान पर बनाता है, जो बड़े डेटाबेस केस (उसके समाधान में बताया गया है) को छोड़कर अच्छी तरह से काम करता है। संपूर्ण तालिका को आपके सिस्टम की मेमोरी में फिट होने की आवश्यकता है, और मेरे लिए यह कोई विकल्प नहीं था। मुझे शक है कि सबसे अच्छा समाधान System.Data.SqlClient.SqlDataReader और एक कस्टम CSV धारावाहिक ( उदाहरण के लिए यहां देखें ) या MS SQL ड्राइवर और CSV क्रमांकन के साथ एक अन्य भाषा का उपयोग करेगा । मूल प्रश्न की भावना में, जो शायद बिना किसी निर्भरता के समाधान की तलाश में था, नीचे दिए गए PowerShell कोड ने मेरे लिए काम किया। यह विशेष रूप से $ डाटा ऐरे को इंस्टेंट करने और हर $ chunk_size लाइनों के लिए परिशिष्ट मोड में एक्सपोर्ट-सीएसवी को कॉल करने में बहुत धीमा और अक्षम है।

$chunk_size = 10000
$command = New-Object System.Data.SqlClient.SqlCommand
$command.CommandText = "SELECT * FROM <TABLENAME>"
$command.Connection = $connection
$connection.open()
$reader = $command.ExecuteReader()

$read = $TRUE
while($read){
    $counter=0
    $DataTable = New-Object System.Data.DataTable
    $first=$TRUE;
    try {
        while($read = $reader.Read()){

            $count = $reader.FieldCount
            if ($first){
                for($i=0; $i -lt $count; $i++){
                    $col = New-Object System.Data.DataColumn $reader.GetName($i)
                    $DataTable.Columns.Add($col)
                }
                $first=$FALSE;
            }

            # Better way to do this?
            $data=@()
            $emptyObj = New-Object System.Object
            for($i=1; $i -le $count; $i++){
                $data +=  $emptyObj
            }

            $reader.GetValues($data) | out-null
            $DataRow = $DataTable.NewRow()
            $DataRow.ItemArray = $data
            $DataTable.Rows.Add($DataRow)
            $counter += 1
            if ($counter -eq $chunk_size){
                break
            }
        }
        $DataTable | Export-Csv "output.csv" -NoTypeInformation -Append
    }catch{
        $ErrorMessage = $_.Exception.Message
        Write-Output $ErrorMessage
        $read=$FALSE
        $connection.Close()
        exit
    }
}
$connection.close()

1

बीसीपी के साथ वैकल्पिक विकल्प:

exec master..xp_cmdshell 'BCP "sp_who" QUERYOUT C:\av\sp_who.txt -S MC0XENTC -T -c '

1

आमतौर पर उपयोगिता केsqlcmd साथ आता है ( डिफ़ॉल्ट रूप से ) जो सीएसवी में डिफ़ॉल्ट रूप से निर्यात करता है।bcpmssql-tools

उपयोग:

bcp {dbtable | query} {in | out | queryout | format} datafile

उदाहरण के लिए:

bcp.exe MyTable out data.csv

सभी तालिकाओं को संबंधित CSV फ़ाइलों में डंप करने के लिए, यहां Bash स्क्रिप्ट दी गई है:

#!/usr/bin/env bash
# Script to dump all tables from SQL Server into CSV files via bcp.
# @file: bcp-dump.sh
server="sql.example.com" # Change this.
user="USER" # Change this.
pass="PASS" # Change this.
dbname="DBNAME" # Change this.
creds="-S '$server' -U '$user' -P '$pass' -d '$dbname'"
sqlcmd $creds -Q 'SELECT * FROM sysobjects sobjects' > objects.lst
sqlcmd $creds -Q 'SELECT * FROM information_schema.routines' > routines.lst
sqlcmd $creds -Q 'sp_tables' | tail -n +3 | head -n -2 > sp_tables.lst
sqlcmd $creds -Q 'SELECT name FROM sysobjects sobjects WHERE xtype = "U"' | tail -n +3 | head -n -2 > tables.lst

for table in $(<tables.lst); do
  sqlcmd $creds -Q "exec sp_columns $table" > $table.desc && \
  bcp $table out $table.csv -S $server -U $user -P $pass -d $dbname -c
done

0

ऊपर दिए गए एक उत्तर ने इसे लगभग मेरे लिए हल कर दिया लेकिन यह सही ढंग से एक पार्स सीएसवी नहीं बनाता है।

यहाँ मेरा संस्करण है:

sqlcmd -S myurl.com -d MyAzureDB -E -s, -W -i mytsql.sql | findstr /V /C:"-" /B > parsed_correctly.csv

कोई कह रहा है कि sqlcmdकुछ PowerShell विकल्प के पक्ष में पुराना है भूल रहा है कि sqlcmdसिर्फ विंडोज के लिए नहीं है। मैं लिनक्स पर हूं (और जब विंडोज पर मैं पीएस से बचता हूं तो वैसे भी)।

यह सब कहने के बाद, मुझे bcpआसान लगता है।


0

2 कारणों का पालन करने के बाद, आपको सीएमडी में अपना समाधान चलाना चाहिए:

  1. क्वेरी में दोहरे उद्धरण हो सकते हैं
  2. लॉगिन उपयोगकर्ता नाम और पासवर्ड कभी-कभी दूरस्थ SQL सर्वर आवृत्ति को क्वेरी करने के लिए आवश्यक है

    sqlcmd -U [your_User]  -P[your_password] -S [your_remote_Server] -d [your_databasename]  -i "query.txt" -o "output.csv" -s"," -w 700

-2

आप इसे हैकिश तरीके से कर सकते हैं। sqlcmdहैक का उपयोग कर सावधान । यदि डेटा में दोहरे उद्धरण या अल्पविराम हैं तो आप मुश्किल में पड़ जाएंगे।

आप इसे ठीक से करने के लिए एक सरल स्क्रिप्ट का उपयोग कर सकते हैं:

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Data Exporter                                                 '
'                                                               '
' Description: Allows the output of data to CSV file from a SQL '
'       statement to either Oracle, SQL Server, or MySQL        '
' Author: C. Peter Chen, http://dev-notes.com                   '
' Version Tracker:                                              '
'       1.0   20080414 Original version                         '
'   1.1   20080807 Added email functionality                '
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
option explicit
dim dbType, dbHost, dbName, dbUser, dbPass, outputFile, email, subj, body, smtp, smtpPort, sqlstr

'''''''''''''''''
' Configuration '
'''''''''''''''''
dbType = "oracle"                 ' Valid values: "oracle", "sqlserver", "mysql"
dbHost = "dbhost"                 ' Hostname of the database server
dbName = "dbname"                 ' Name of the database/SID
dbUser = "username"               ' Name of the user
dbPass = "password"               ' Password of the above-named user
outputFile = "c:\output.csv"      ' Path and file name of the output CSV file
email = "email@me.here"           ' Enter email here should you wish to email the CSV file (as attachment); if no email, leave it as empty string ""
  subj = "Email Subject"          ' The subject of your email; required only if you send the CSV over email
  body = "Put a message here!"    ' The body of your email; required only if you send the CSV over email
  smtp = "mail.server.com"        ' Name of your SMTP server; required only if you send the CSV over email
  smtpPort = 25                   ' SMTP port used by your server, usually 25; required only if you send the CSV over email
sqlStr = "select user from dual"  ' SQL statement you wish to execute
'''''''''''''''''''''
' End Configuration '
'''''''''''''''''''''



dim fso, conn

'Create filesystem object 
set fso = CreateObject("Scripting.FileSystemObject")

'Database connection info
set Conn = CreateObject("ADODB.connection")
Conn.ConnectionTimeout = 30
Conn.CommandTimeout = 30
if dbType = "oracle" then
    conn.open("Provider=MSDAORA.1;User ID=" & dbUser & ";Password=" & dbPass & ";Data Source=" & dbName & ";Persist Security Info=False")
elseif dbType = "sqlserver" then
    conn.open("Driver={SQL Server};Server=" & dbHost & ";Database=" & dbName & ";Uid=" & dbUser & ";Pwd=" & dbPass & ";")
elseif dbType = "mysql" then
    conn.open("DRIVER={MySQL ODBC 3.51 Driver}; SERVER=" & dbHost & ";PORT=3306;DATABASE=" & dbName & "; UID=" & dbUser & "; PASSWORD=" & dbPass & "; OPTION=3")
end if

' Subprocedure to generate data.  Two parameters:
'   1. fPath=where to create the file
'   2. sqlstr=the database query
sub MakeDataFile(fPath, sqlstr)
    dim a, showList, intcount
    set a = fso.createtextfile(fPath)

    set showList = conn.execute(sqlstr)
    for intcount = 0 to showList.fields.count -1
        if intcount <> showList.fields.count-1 then
            a.write """" & showList.fields(intcount).name & ""","
        else
            a.write """" & showList.fields(intcount).name & """"
        end if
    next
    a.writeline ""

    do while not showList.eof
        for intcount = 0 to showList.fields.count - 1
            if intcount <> showList.fields.count - 1 then
                a.write """" & showList.fields(intcount).value & ""","
            else
                a.write """" & showList.fields(intcount).value & """"
            end if
        next
        a.writeline ""
        showList.movenext
    loop
    showList.close
    set showList = nothing

    set a = nothing
end sub

' Call the subprocedure
call MakeDataFile(outputFile,sqlstr)

' Close
set fso = nothing
conn.close
set conn = nothing

if email <> "" then
    dim objMessage
    Set objMessage = CreateObject("CDO.Message")
    objMessage.Subject = "Test Email from vbs"
    objMessage.From = email
    objMessage.To = email
    objMessage.TextBody = "Please see attached file."
    objMessage.AddAttachment outputFile

    objMessage.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
    objMessage.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = smtp
    objMessage.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = smtpPort

objMessage.Configuration.Fields.Update

    objMessage.Send
end if

'You're all done!!  Enjoy the file created.
msgbox("Data Writer Done!")

स्रोत: VBScript के साथ CSV में SQL आउटपुट लिखना


1
डाउनवोट के लिए एक स्पष्टीकरण अच्छा होगा। मेरा उत्तर सही है: आप sqlcmd के साथ ऐसा नहीं कर सकते। मैंने कार्य को पूरा करने के लिए एक वैकल्पिक तरीका भी पेश किया।
सेरेल बोथा

4
Downvote है क्योंकि आप स्पष्ट रूप से कर सकते हैं कि ओपी sqlcmd के साथ क्या पूछ रहा है।
ब्रायन ड्रिस्कॉल

2
@BrianDriscoll, उन्होंने यह नहीं कहा कि कोई भी ऐसा नहीं कर सकता है sqlcmd, हम केवल इस तथ्य को बता sqlcmdरहे हैं कि अल्पविराम से ठीक से बच नहीं रहा है, इस प्रकार किसी भी गंभीर सीएसवी आउटपुट के लिए मुश्किल से उपयोगी है ।
सेबस्टियन

मैंने ऐसा कहा, लेकिन नीचे की ओर से थक गया, इसलिए मैंने अपना जवाब संपादित किया। मैं अपने संपादन को और अधिक सत्य बनाऊंगा।
सेरेल बोथा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.