एक सीएसवी फ़ाइल के लिए चयन परिणाम लेखन


37

हमें एक csv फ़ाइल के लिए SELECT क्वेरी परिणाम लिखने की आवश्यकता है। SQL Server 2008 r2 में T-SQL का उपयोग कैसे किया जा सकता है? मुझे पता है कि यह SSIS में किया जा सकता है, लेकिन कुछ कारणों से, हमारे पास यह विकल्प नहीं है।

मैंने नीचे दिए गए लेख में सुझाए गए प्रोक का उपयोग करने का प्रयास किया, लेकिन जब मैं प्रोक को चलाता हूं, तो SQL शिकायत करता है कि sys.sp_OACreate और sys.sp_OADestroy नहीं चला सकते हैं जिन्हें इस प्रॉप में कहा जाता है।

क्या आप जानते हैं कि हम इन घटकों को कैसे चालू कर सकते हैं या टी-एसक्यूएल का उपयोग करके किसी फ़ाइल को लिखने का कोई बेहतर तरीका जान सकते हैं?

अग्रिम में धन्यवाद।

जवाबों:


52

BCP उपयोगिता का उपयोग करें

bcp "SELECT Col1,Col2,Col3 FROM MyDatabase.dbo.MyTable" queryout "D:\MyTable.csv" -c -t , -S SERVERNAME -T

-cतर्क निर्दिष्ट haracter उत्पादन, एसक्यूएल के देशी द्विपदीय प्रारूप करने के लिए विरोध के रूप में; यह टैब-अलग -t ,किए गए मानों को डिफॉल्ट करता है, लेकिन फ़ील्ड t erminator को कॉमा में बदल देता है। -Tविंडोज प्रमाणीकरण निर्दिष्ट करता है (" टी रस्टेड कनेक्शन"), अन्यथा उपयोग करें -U MyUserName -P MyPassword

यह कॉलम हेडर को डिफ़ॉल्ट रूप से निर्यात नहीं करता है। आपको हेडर के लिए UNION ALL का उपयोग करना होगा

या

SQLCMD का उपयोग करें

SQLCMD -S SERVERNAME -E -Q "SELECT Col1,Col2,Col3 FROM MyDatabase.dbo.MyTable"
-s "," -o "D:\MyData.csv" 

या

Powershell का उपयोग करें

यहाँ एक लेख के लिए एक कड़ी है । यदि आप इसका उपयोग करते हैं, तो आप आउटपुट फ़ाइल पर अनावश्यक कॉलम से छुटकारा पाने के -notypeबाद जोड़ना चाहते हैं Export-Csv $extractFile


4
+1 BCP उपयोगिता के लिए - यह उपयोग के लिए बहुत आसान है, यह सबसे तेज़ उपकरण है जिसे मैंने कभी भी निर्यात / आयात की जानकारी के लिए उपयोग किया है और बहुत सारे विकल्प हैं। मैं आपको कथन के अंत में "> FileName.log" जोड़ने की सलाह दूंगा - यह एक लॉग फ़ाइल बनाएगा।
9

24

पिछले उत्तर में जोड़ना, जो आपको कार्रवाई को स्वचालित करने में मदद करता है, अगर आपको समय-समय पर इसकी आवश्यकता होती है तो आप इसे प्रबंधन स्टूडियो में कर सकते हैं, बस हेडर पर राइट क्लिक करें - परिणाम सहेजें -> .csv फ़ाइल चुनें

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

एक अन्य तरीका, जिसे आसानी से स्वचालित किया जा सकता है, और एसएसआईएस का उपयोग करता है, प्रबंधन स्टूडियो के निर्यात डेटा सुविधा का उपयोग करके है। डेटाबेस पर राइट क्लिक करें -> कार्य -> ​​डेटा निर्यात करें। वहाँ एक जादूगर है जिसमें बहुत सारे विकल्प हैं। आपको स्रोत डेटाबेस, गंतव्य और अन्य विकल्प चुनना चाहिए। गंतव्य के लिए सुनिश्चित करें कि यह "फ्लैट फ़ाइल" है, ब्राउज़ करें और चुनें .csv प्रकार, आपको जो भी स्वरूपण की आवश्यकता है उसे चुनें और अंत में आप एक SSIS पैकेज प्राप्त करेंगे जिसे स्थानीय रूप से सहेजा जा सकता है और आवश्यकता पर दोहराया जा सकता है।


10

टी-एसक्यूएल का उपयोग करें

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 प्रदाता उपलब्ध होना चाहिए। जेट 4.0 प्रदाता भी काम करेगा, लेकिन यह प्राचीन है, इसलिए मैंने इसके बजाय इसका उपयोग किया।
  2. .CSV फ़ाइल को पहले से मौजूद होना चाहिए। यदि आप हेडर (HDR = YES) का उपयोग कर रहे हैं, तो सुनिश्चित करें कि .CSV फ़ाइल की पहली पंक्ति सभी क्षेत्रों की सीमांकित सूची है।

1
अब तक का सबसे अच्छा जवाब!
अजेह


5

कम तकनीक, लेकिन ...

select
   col1 + ','
+  cast(col2 as varchar(10)) + ','
+  col3
from mytable;

MySQL col1 + ',' + cast(col2 as varchar(10)) + ',' + col3एक स्तंभ नाम के रूप में व्यवहार करता है , और पूरे स्थान पर NULL प्रिंट करता है।
निखिल वाघ

4

ऐसा लगता है कि आपके पास पहले से ही एक स्वीकार्य समाधान है, लेकिन अगर आपके पास db मेल सेट अप है तो आप संभवतः ऐसा कुछ कर सकते हैं:

EXEC msdb.dbo.sp_send_dbmail
    @recipients='your.email@domain.com',
    @subject='CSV Extract', 
    @body='See attachment',
    @query ='SELECT Col1,Col2,Col3 FROM MyDatabase.dbo.MyTable',
    @attach_query_result_as_file = 1,
    @query_attachment_filename = 'CSV_Extract.txt',
    @query_result_separator = ',',
    @query_result_header = 1

यदि आप फ़ाइल को कहीं भी ईमेल कर रहे हैं, तो यह आपको कुछ कदम बचा सकता है।


बस मैं क्या देख रहा था, तुम्हें कुदोस!
मशाच

हालाँकि आपको @profile_name पैरामीटर जोड़ना होगा, यदि आपके पास अपने उपयोगकर्ता के लिए कोई डिफ़ॉल्ट निजी प्रोफ़ाइल नहीं है और न ही डेटाबेस के लिए सार्वजनिक प्रोफ़ाइल है।
मशाच

1

यह आसानी से एक 3 कदम प्रक्रिया में किया जा सकता है:

  1. अपनी क्वेरी को क्वेरी के रूप में लिखें SELECT INTO। यह अनिवार्य रूप से आपकी क्वेरी परिणामों को तालिका में निर्यात करेगा।

    Select
      Field1
     ,Field2
     ,Field3
    INTO dbo.LogTableName         --Table where the query Results get logged into.
    From Table

    ध्यान दें, जब क्वेरी चलती है, तो यह तालिका मौजूद नहीं हो सकती , क्योंकि इस प्रकार की क्वेरी निष्पादन के भाग के रूप में तालिका बनाना चाहती है।

  2. फिर उस तालिका के परिणामों को निर्यात करने के लिए SSIS का उपयोग करें .csv । SSIS निर्यात विज़ार्ड आपको अपना सीमांकक आदि चुनने देता है, यह वास्तव में a का उपयोग करने के लिए आसान है उदाहरणों में परिसीमन जहां परिणाम सेट में अल्पविराम होता है।

    राईट क्लिक करें DB Name > Tasks > Export Data

  3. निर्यात पूरा हो जाने के बाद, DROP TABLEअपने लॉग टेबल को साफ करने के लिए कमांड निष्पादित करें ।

    Drop Table dbo.LogTableName

3
हाय डॉन। मैंने आपके उत्तर में कुछ प्रारूपण जोड़ा है। यदि आप बदले हुए हैं, तो यह देखने के लिए कि क्या आप वापस रोल करना चाहते हैं, पूरा देखने के लिए निचले-बाएँ में 'संपादित करें' पर क्लिक कर सकते हैं और "संपादित" xx मिनट "बिट" पर क्लिक कर सकते हैं। जो पहले से ही लिखा गया है और बहुत ध्यान आकर्षित करने की संभावना नहीं है।
माइकल ग्रीन

0

मैं SQL सर्वर से CSV को निर्यात करने के लिए MS Access DoCMD का उपयोग करता हूं। यह एक एकल आदेश के साथ करने में सक्षम है। एक्सेस डेटाबेस का उपयोग केवल एक्सेस कमांड को सक्षम करने के लिए किया जाता है। यह अच्छा प्रदर्शन करता है, और एक अतिरिक्त लाभ के रूप में (निश्चित रूप से क्यों नहीं) यह निर्यात की गई तालिका के लिए एक स्कीमा.इन बनाता है।

एडम

CMD="SELECT * INTO [Text;HDR=Yes;DATABASE=C:\].[Results.txt]  
FROM [ODBC;DSN=SQL2017;Description=SQL2017;UID=.;Trusted_Connection=Yes;APP=Microsoft Office 2013;WSID=LAPTOP-XYZ;DATABASE=TempDB_DataDump_1].Results "

 Set appAccess = CreateObject("Access.Application") 
                appAccess.OpenCurrentDatabase "anyAccessdatabase.mdb" 
                   ' appAccess.DoCmd.SetWarnings 0
                    appAccess.DoCmd.runsql "CMD"

-1

यह प्रक्रिया एक पैरामीटर के रूप में आपके द्वारा पारित क्वेरी के आउटपुट के साथ एक सीएसवी फ़ाइल उत्पन्न करेगी। दूसरा पैरामीटर आपका CSV फ़ाइल नाम है, सुनिश्चित करें कि आप फ़ाइल नाम को किसी मान्य लेखन पथ से पास करते हैं।

यहाँ प्रक्रिया बनाने के लिए स्क्रिप्ट है:

CREATE procedure [dbo].[usp_create_csv_file_from_query]
    @sql Nvarchar(MAX),
    @csvfile Nvarchar(200)
    as
    BEGIN
        if IsNull(@sql,'') = '' or IsNull(@csvfile,'') = ''
        begin
            RAISERROR ('Invalid SQL/CsvFile values passed!; Aborting...', 0, 1) WITH NOWAIT
            return
        end
        DROP TABLE if exists global_temp_CSVtable;
        declare 
            @columnList varchar(4000), 
            @columnList1 varchar(4000),
            @sqlcmd varchar(4000),
            @dos_cmd nvarchar(4000)

        set @sqlcmd = replace(@sql, 'from', 'into global_temp_CSVtable from')
        EXECUTE (@sqlcmd); 

        declare @cols table (i int identity, colname varchar(100))
        insert into @cols
        select column_name
        from information_schema.COLUMNS
        where TABLE_NAME = 'global_temp_CSVtable'

        declare @i int, @maxi int
        select @i = 1, @maxi = MAX(i) from @cols

        while(@i <= @maxi)
        begin
            select @sql = 'alter table global_temp_CSVtable alter column [' + colname + '] VARCHAR(max) NULL'
            from @cols
            where i = @i
            exec sp_executesql @sql
            select @i = @i + 1
        end

        SELECT 
             @columnList = COALESCE(@columnList + ''', ''', '') + column_name 
            ,@columnList1 = COALESCE(@columnList1 + ', ', '') + column_name
        from information_schema.columns
        where table_name =  'global_temp_CSVtable'
        ORDER BY ORDINAL_POSITION;

        SELECT @columnList = '''' + @columnList + '''';

        SELECT @dos_cmd='BCP "SELECT ' + @columnList + 
                        ' UNION ALL ' +
                        'SELECT * from ' + db_name() + '..global_temp_CSVtable" ' + 
                        'QUERYOUT ' + @csvfile + 
                        ' -c -t, -T'
        exec master.dbo.xp_cmdshell @dos_cmd, No_output 
        DROP TABLE if exists global_temp_CSVtable;
    end

2
कोड केवल उत्तर के रूप में स्वीकार्य नहीं हैं - क्या आप अपने उत्तर में कुछ टिप्पणी जोड़ सकते हैं और यह क्यों काम करता है? (कोड टिप्पणी शायद यहाँ भी मदद करेगी)
जॉर्ज।

हां, और क्या आप एक उदाहरण भी जोड़ सकते हैं कि आपने इसका सफलतापूर्वक उपयोग कैसे किया?
मार्सेलो मिओरेल्ली
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.