সিএসভি ফাইলে সিলেক্ট রেজাল্ট লেখা


37

আমাদের একটি সিএসভি ফাইলে SELECT ক্যোয়ারির ফলাফল লিখতে হবে। এটি এসকিউএল সার্ভার ২০০৮ r2-এ টি-এসকিউএল ব্যবহার করে কীভাবে করা যায়? আমি জানি যে এটি এসএসআইএস-এ করা যেতে পারে তবে কিছু কারণে আমাদের কাছে এই বিকল্প নেই।

আমি নীচের নিবন্ধে প্রস্তাবিত প্রকল্পটি ব্যবহার করার চেষ্টা করেছি, তবে যখন আমি এই প্রকল্পটি চালাচ্ছি তখন এসকিউএল অভিযোগ করে যে এই প্রকল্পে ডাকা হয় এমন sys.sp_OACreate এবং sys.sp_OADestroy চালাতে পারে না।

আপনি কী জানেন যে কীভাবে আমরা এই উপাদানগুলি চালু করতে পারি বা টি-এসকিউএল ব্যবহার করে কোনও ফাইলে লেখার আরও ভাল উপায় জানতে পারি?

আগাম ধন্যবাদ.

উত্তর:


52

বিসিপি ইউটিলিটি ব্যবহার করুন

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

-cযুক্তি নির্দিষ্ট করে haracter আউটপুট, এসকিউএল এর নেটিভ বাইনারি ফর্ম্যাটে ভিন্ন; এটি ডিফল্ট ট্যাব-বিভাজিত মানগুলিতে -t ,পরিবর্তিত হয় তবে ক্ষেত্রের টি এমিনেটরকে কমাতে পরিবর্তন করে । -Tউইন্ডোজ প্রমাণীকরণ নির্দিষ্ট করে (" টি মরিচা সংযোগ"), অন্যথায় ব্যবহার করুন -U MyUserName -P MyPassword

এটি ডিফল্টরূপে কলাম শিরোনাম রফতানি করে না। শিরোনামগুলির জন্য আপনাকে একটি ইউনিয়ন সমস্ত ব্যবহার করতে হবে

অথবা

এসকিউএলসিএমডি ব্যবহার করুন

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

অথবা

পাওয়ারশেল ব্যবহার করুন

এখানে একটি নিবন্ধের লিঙ্ক দেওয়া আছে । আপনি এই ব্যবহার শেষ হলে, আপনি যোগ করতে চাইতে পারেন -notypeপর Export-Csv $extractFileআউটপুট ফাইলের উপর অপ্রয়োজনীয় কলাম পরিত্রাণ পেতে।


4
বিসিপি ইউটিলিটির জন্য +1 - এটি ব্যবহারের পক্ষে খুব সহজ, এটি আমি রফতানি / আমদানির তথ্যের জন্য সবচেয়ে দ্রুততম সরঞ্জাম এবং এটিতে প্রচুর বিকল্প রয়েছে। আমি আপনাকে বিবৃতি শেষে "> ফাইলের নাম.লগ" যুক্ত করার পরামর্শ দেব - এটি একটি লগ ফাইল তৈরি করবে।
gotqn

24

পূর্ববর্তী উত্তরে যুক্ত করা, যা আপনাকে অ্যাকশনটি স্বয়ংক্রিয় করতে সহায়তা করে, যদি আপনার প্রয়োজন হয় সময়ে সময়ে কেবল এটি ম্যানেজমেন্ট স্টুডিওতে করতে, কেবল শিরোনামটিতে ডান ক্লিক করুন - ফলাফলগুলি সংরক্ষণ করুন -> একটি .csv ফাইল চয়ন করুন

বা আপনি চালিত প্রতিটি নির্বাচিত বিবৃতিটির জন্য যদি তা করতে চান তবে আপনি ফলাফলের আউটপুট দিকটি কোনও ফাইলে পরিবর্তন করতে পারেন। ব্যবহারের সরঞ্জামগুলি -> বিকল্পসমূহ -> ক্যোয়ারী ফলাফল - ফাইলে ফলাফল

আরেকটি উপায়, যা সহজেই স্বয়ংক্রিয়ভাবে তৈরি করা যায় এবং এসএসআইএস ব্যবহার করে তা হ'ল ম্যানেজমেন্ট স্টুডিওর এক্সপোর্ট ডেটা বৈশিষ্ট্যটি ব্যবহার করে। ডাটাবেস -> টাস্ক -> রফতানি ডানদিকে ডান ক্লিক করুন। সেখানে অনেকগুলি বিকল্প সহ একটি উইজার্ড রয়েছে। আপনার উত্স ডাটাবেস, গন্তব্য এবং অন্যান্য বিকল্প চয়ন করা উচিত। গন্তব্যের জন্য নিশ্চিত হয়ে নিন যে এটি "ফ্ল্যাট ফাইল", ব্রাউজ করুন এবং .csv প্রকারটি চয়ন করুন, আপনার যা প্রয়োজন বিন্যাস চয়ন করুন এবং শেষে আপনি একটি এসএসআইএস প্যাকেজ পাবেন যা স্থানীয়ভাবে সংরক্ষণ করা যায় এবং প্রয়োজনে পুনরাবৃত্তি করা যেতে পারে।


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 সরবরাহকারী উপলব্ধ থাকতে হবে। জেট provider.০ সরবরাহকারীও কাজ করবে, তবে এটি প্রাচীন, তাই পরিবর্তে আমি এটি ব্যবহার করেছি used
  2. .CSV ফাইলটি ইতিমধ্যে বিদ্যমান থাকতে হবে। আপনি যদি শিরোনাম (এইচডিআর = ইয়েস) ব্যবহার করছেন তবে নিশ্চিত করুন যে .CSV ফাইলের প্রথম লাইনটি সমস্ত ক্ষেত্রের সীমানা তালিকা।

1
এখন পর্যন্ত সেরা উত্তর!
আজেহ


5

কম প্রযুক্তি, কিন্তু ...

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

মাইএসকিউএল col1 + ',' + cast(col2 as varchar(10)) + ',' + col3একটি কলামের নাম হিসাবে বিবেচনা করে , এবং সমস্ত জায়গাতেই NULL মুদ্রণ করে।
নিখিল ওঘ

4

দেখে মনে হচ্ছে আপনার ইতিমধ্যে একটি গ্রহণযোগ্য সমাধান রয়েছে, তবে আপনার যদি ডিবি মেল সেট আপ থাকে তবে আপনি সম্ভবত এর মতো কিছু করতে পারেন:

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

আপনি যদি কোনওভাবেই ফাইলটি ইমেল করছেন তবে এটি আপনাকে কয়েকটি পদক্ষেপ বাঁচাতে পারে।


আমি যা খুঁজছিলাম, আপনি কি কুডোস!
মাশচ্যাক্স

যদিও আপনার যদি আপনার ব্যবহারকারীর জন্য কোনও ডিফল্ট ব্যক্তিগত প্রোফাইল বা ডেটাবেসটির জন্য সর্বজনীন প্রোফাইল না থাকে তবে আপনাকে @ প্রোফাইলে_নাম পরামিতি যুক্ত করতে হবে।
মাশচ্যাক্স

1

এটি সহজেই 3 ধাপের প্রক্রিয়াতে করা যেতে পারে:

  1. আপনার প্রশ্নের জিজ্ঞাসা হিসাবে লিখুন SELECT INTO। এটি মূলত আপনার প্রশ্নের ফলাফলগুলি একটি টেবিলের মধ্যে রফতানি করবে।

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

    দ্রষ্টব্য, এই সারণীটি যখন ক্যোয়ারী চালিত হয় তখন উপস্থিত থাকতে পারে না , কারণ এই ধরণের কোয়েরি কার্যকর করার অংশ হিসাবে টেবিলটি তৈরি করতে চায়।

  2. তারপরে সেই টেবিলের ফলাফলগুলিতে রফতানি করতে এসএসআইএস ব্যবহার করুন .csv। এসএসআইএস এক্সপোর্ট উইজার্ড আপনাকে আপনার ডিলিমিটার ইত্যাদি চয়ন করতে দেয় | | এটি ব্যবহার করার জন্য সত্যই কার্যকর hand ফলাফলের সীমানায় কমা রয়েছে এমন দৃষ্টান্তগুলিতে ডিলিমিটার।

    রাইট ক্লিক করুন DB Name > Tasks > Export Data

  3. এক্সপোর্টটি সম্পূর্ণ হয়ে গেলে DROP TABLEআপনার লগ টেবিলটি পরিষ্কার করার জন্য আদেশটি কার্যকর করুন ।

    Drop Table dbo.LogTableName

3
হাই ডন আমি আপনার উত্তরে কিছু ফর্ম্যাটিং যুক্ত করেছি। কী পরিবর্তন হয়েছে তা দেখতে আপনি নীচের বামে 'সম্পাদনা' এ ক্লিক করতে পারেন এবং যদি আপনি ফিরে যেতে চান তবে পুরো ইতিহাস দেখতে "সম্পাদিত" এক্সএক্স মিনিট "বিটটিতে ক্লিক করতে পারেন work কার্যকর হলেও, আপনার উত্তর খুব বেশি যোগ করে না কি ইতিমধ্যে লিখিত হয়েছে এবং আরো অনেক মনোযোগ আকর্ষণ করার সম্ভাবনা কম।
মাইকেল গ্রিন

0

আমি এসকিউএল সার্ভার থেকে সিএসভি গুলি রফতানি করতে এমএস অ্যাক্সেস ডোকিএমডি ব্যবহার করি। এটি একটি একক আদেশ দিয়ে এটি করতে সক্ষম। অ্যাক্সেস ডাটাবেস কেবল অ্যাক্সেস কমান্ড সক্ষম করতে ব্যবহৃত হয়। এটি ভাল সম্পাদন করে, এবং একটি অতিরিক্ত সুবিধা হিসাবে (কেন নিশ্চিত নয়) এটি রফতানি টেবিলের জন্য একটি স্কিমা.আইএনআই তৈরি করে।

আদম

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

এই পদ্ধতিটি আপনার প্যারামিটার হিসাবে পাস করা ক্যোয়ারীর আউটপুট সহ একটি সিএসভি ফাইল তৈরি করবে। ২ য় প্যারামিটারটি আপনার সিএসভি ফাইলের নাম, নিশ্চিত করুন যে আপনি ফাইলের নামটি একটি বৈধ লিখনযোগ্য পাথ দিয়ে পাস করেছেন।

পদ্ধতিটি তৈরি করার জন্য এখানে স্ক্রিপ্ট রয়েছে:

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
কোডের উত্তরগুলি কেবল এখানে গ্রহণযোগ্য হিসাবে দেখা যায় না - আপনি কি নিজের উত্তর সম্পর্কে কিছু মন্তব্য যুক্ত করতে পারেন এবং এটি কেন কাজ করে? (কোড মন্তব্যগুলি সম্ভবত এখানেও সহায়তা করবে)
জর্জ। প্যালাসিয়াস

হ্যাঁ, এবং আপনি কীভাবে এটি সফলভাবে ব্যবহার করেছেন সেই হিসাবে আপনি একটি উদাহরণ যোগ করতে পারেন?
মার্সেলো মিয়োরেলি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.