কিভাবে এসকিউএল সার্ভার থেকে এসকিউএলসিএমডি ব্যবহার করে সিএসভি ফর্ম্যাট হিসাবে ডেটা রফতানি করবেন?


136

আমি সহজেই কোনও টেক্সট ফাইলে ডেটা ডাম্প করতে পারি যেমন:

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

তবে আমি সাহায্যের ফাইলগুলির দিকে নজর রেখেছি তবে SQLCMDবিশেষত সিএসভি-র জন্য কোনও বিকল্প দেখিনি।

কোনও টেবিল থেকে সিএসভি পাঠ্য ফাইল ব্যবহার করে ডেটা ফেলার কোনও উপায় আছে কি SQLCMD?


এটি অবশ্যই এসকিএলসিএমডি এর মাধ্যমে হওয়া উচিত, বা আপনি নীচের মতো অন্য কোনও প্রোগ্রাম ব্যবহার করতে পারেন: কোডেপ্রজেক্ট
বার্নহার্ড হফম্যান

এটি হওয়ার দরকার নেই তবে আমি অন্য কিছু রফতানি ইউটিলিটিতে ডুব দেওয়ার আগে স্কুয়েল সিএমডি আসলে এটি করতে পারে কি না তা আমি নিশ্চিতভাবে জানতে চেয়েছিলাম। একটি বিষয় উল্লেখ করার জন্য এটির স্ক্রিপ্টযোগ্য হওয়া দরকার।
রায়

এখানে একটি এসএসএমএস ২০০৮ অ্যাডিন সরঞ্জাম রয়েছে যা আপনার টেবিলগুলি থেকে সিএসভি আউটপুট দেয় যা কাস্টমাইজড হতে পারে এবং ধারা দ্বারা আদেশ করতে পারে। 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
@ জিসাক তারপরে আপনার ডেটাতে কোনও ডাবল কোট না রয়েছে তা নিশ্চিত করুন বা দুটি ডাবল উদ্ধৃতি দিয়ে আপনার ডাবল উদ্ধৃতিগুলি প্রতিস্থাপন করার বিষয়টি নিশ্চিত করুন।
সারেল বোথা

1
কেউ কি ডেটাতে কমা দেওয়ার অনুমতি দেওয়ার জন্য কী করতে হবে তা স্পষ্ট করে বলতে পারেন? আমাদের কি প্রতিটি কলামকে "" "+ + ___ + '" "দিয়ে ঘিরে থাকতে হবে?
আহমেদ

2
এই উত্তরটি এখন পুরানো। পাওয়ারশেল স্ক্রিপ্টগুলি আরও নমনীয় এবং এসকিউএল সার্ভারে একটি কাজের এজেন্ট হিসাবে চালানো যেতে পারে।
ক্লিনটন ওয়ার্ড

75

পাওয়ারশেলের সাহায্যে আপনি ইনভোক-এসকিএলসিএমডি এক্সপোর্ট-সিএসভিতে ঝরঝরে করে সমস্যার সমাধান করতে পারেন।

#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-Sqlcmdcmdlet, এমনকি যদি আপনি শুধু SSMS 2016. আগে যে ইনস্টল হবে যা, এসকিউএল সার্ভার 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

এসকিউএল সার্ভার ২০০৮ এবং ২০০৮ আর ২-এর উদাহরণটি মানিয়ে নিতে, #Requiresপুরোপুরি লাইনটি সরিয়ে ফেলুন এবং স্ট্যান্ডার্ড পাওয়ারশেল হোস্টের পরিবর্তে sqlps.exe ইউটিলিটিটি ব্যবহার করুন ।

ইনভোক-এসকিউএলসিএমডি হ'ল স্কেলসিএমডি.এক্সির পাওয়ারশেল সমতুল্য। পাঠ্যের পরিবর্তে এটি সিস্টেম.ডাটা.ডাটাআরও বস্তুকে আউটপুট করে।

-Queryপ্যারামিটার মত কাজ করে -Qsqlcmd.exe এর প্যারামিটার। এটিকে একটি এসকিউএল কোয়েরি পাস করুন যা আপনি যে ডেটা রফতানি করতে চান তা বর্ণনা করে।

-Databaseপ্যারামিটার মত কাজ করে -dsqlcmd.exe এর প্যারামিটার। এটি যে ডাটাবেসটিতে রফতানি করতে হবে তার নাম দিন।

-Serverপ্যারামিটার মত কাজ করে -Ssqlcmd.exe এর প্যারামিটার। রফতানি করার জন্য ডেটা রয়েছে এমন সার্ভারের নাম এটি পাস করুন।

এক্সপোর্ট-সিএসভি হ'ল একটি পাওয়ারশেল সেমিডলেট যা জেনেরিক বস্তুগুলিকে সিএসভিতে সিরিয়ালাইজ করে। এটি পাওয়ারশেলের সাহায্যে চালিত হয়।

-NoTypeInformationপরামিতি অতিরিক্ত আউটপুট CSV বিন্যাসে অংশ নয় শুষে নেবে। ডিফল্টরূপে cmdlet টাইপ তথ্য সহ একটি শিরোনাম লিখে writes এটি পরে যখন আপনি এটির ডিজাইরিয়াল করেন তখন এটি আপনাকে কীভাবে অবজেক্টের ধরণটি জানতে দেয় Import-Csvতবে স্ট্যান্ডার্ড সিএসভি আশা করে এমন সরঞ্জামগুলিকে বিভ্রান্ত করে।

-Pathপ্যারামিটার মত কাজ করে -osqlcmd.exe এর প্যারামিটার। আপনি যদি পুরানো এসকিউএলপিএস মডিউলটি ব্যবহার করে আটকে থাকেন তবে এই মানটির একটি পূর্ণ পথ সবচেয়ে নিরাপদ ।

-Encodingপ্যারামিটার মত কাজ করে -fবা -usqlcmd.exe এর প্যারামিটার। ডিফল্টরূপে এক্সপোর্ট-সিএসভি কেবল ASCII অক্ষর আউটপুট দেয় এবং অন্য সকলকে প্রশ্ন চিহ্ন দিয়ে প্রতিস্থাপন করে। সমস্ত অক্ষর সংরক্ষণের জন্য UTF8 ব্যবহার করুন এবং অন্যান্য সরঞ্জামগুলির সাথে সামঞ্জস্যপূর্ণ থাকুন।

Sqlcmd.exe বা bcp.exe এর মাধ্যমে এই সমাধানটির প্রধান সুবিধাটি হ'ল আপনাকে বৈধ সিএসভি আউটপুট দেওয়ার আদেশটি হ্যাক করতে হবে না। এক্সপোর্ট-সিএসভি সেমিডিলেট এটি আপনার জন্য সমস্ত পরিচালনা করে।

মূল অসুবিধাটি হ'ল Invoke-Sqlcmdপাইপলাইনটি পাশ করার আগে পুরো ফলাফল সেটটি পড়ে। আপনি রফতানি করতে চান পুরো ফলাফল সেট জন্য আপনার যথেষ্ট মেমরি আছে তা নিশ্চিত করুন।

এটি কয়েক বিলিয়ন সারিগুলির জন্য সহজে কাজ করতে পারে না। যদি সমস্যা হয় তবে আপনি অন্যান্য সরঞ্জাম ব্যবহার করে দেখতে পারেন, বা System.Data.SqlClient.SqlDataReader শ্রেণীর নিজস্ব দক্ষ সংস্করণ Invoke-Sqlcmdব্যবহার করতে পারেন ।


5
অন্যান্য উত্তর সৎভাবে স্তন্যপান, এটি সঠিকভাবে করার একমাত্র উপায়। আমি আশা করি এটি যদিও আরও সুস্পষ্ট ছিল।
শেগলেজ

1
এসকিউএল ২০০৮ আর 2-এ, ইনভোক-এসকিউএলসিএমডি ব্যবহার করতে আমাকে "sqlps.exe" সরঞ্জামটি চালাতে হয়েছিল। ইম্পোর্ট-মডিউলটি ব্যবহার করার জন্য স্পষ্টতই আমার এসকিউএল 2012 দরকার? তবে এটি "sqlps.exe" এর মধ্যে কাজ করে - বিশদ বিবরণের জন্য এই থ্রেডটি দেখুন
মিস্টার_তম

1
@ মিস্টার_টম ভাল পয়েন্ট এসকিউএলপিএস মডিউলটি এসকিউএল ২০১২ এর সাথে প্রবর্তিত হয়েছিল। উত্তর এখন কীভাবে পুরানো সংস্করণগুলির জন্য উদাহরণটি মানিয়ে নেবে তা ব্যাখ্যা করে।
আইয়েন স্যামুয়েল ম্যাকলিন এল্ডার

1
@ জেসনম্যাটনি পাওয়ারশেল হ'ল উইন্ডোজ সিস্টেমগুলির নতুন প্রশাসনিক ইন্টারফেস, তবে এসকিউএল সার্ভারের প্রচুর পরামর্শ এটি স্ট্যান্ডার্ড হওয়ার আগে প্রকাশিত হয়েছিল। কথা ছড়িয়ে দিন! :-)
আইয়েন স্যামুয়েল ম্যাকলিন বয়স্ক

1
এই উত্তরটি কার্যকর তথ্য এবং সমস্যাটি পরিচালনা করার একটি শক্তিশালী এবং নমনীয় বিকল্প উপায় সরবরাহ করে, তবে এটি মূল প্রশ্নের উত্তর দিতে সম্পূর্ণরূপে ব্যর্থ হয় না কারণ এটি বিশেষভাবে বলা হয়েছিল। আমিও পাওয়ারশেল ফ্যান, তবে আসুন ধর্ম প্রচারকে হিস্টিরিয়ায় পরিণত করা যাক না। এসকিউএলসিএমডি শীঘ্রই কোনও সময় চলে যাচ্ছে না।
বারবিকিউ

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

শেষ লাইনে সিএসভি-নির্দিষ্ট বিকল্প রয়েছে।

  • -W   প্রতিটি পৃথক ক্ষেত্র থেকে চলার স্থানগুলি সরিয়ে ফেলুন
  • -s","   কলামে পৃথককারীকে কমাতে সেট করে (,)
  • -w 999   সারি প্রস্থটি 999 অক্ষরে সেট করে

স্কটমের উত্তরটি আমি যা ব্যবহার করি তার খুব কাছাকাছি, তবে আমি এটি -Wদেখতে খুব সুন্দর একটি সংযোজন বলে মনে করি: আমি অন্য কোথাও সিএসভি ব্যবহার করার সময় হোয়াইটস্পেস ট্রিম করার দরকার নেই।

আরো দেখুন দুটিই MSDN sqlcmd রেফারেন্স । এটি /?অপশনটির আউটপুটটিকে লজ্জিত করে।


19
@ সিমগুলি কোয়েরি / ইনপুটফিলের শুরুতে "সেট অনাকাউন্ট"
ডি -_- বি

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.exe MyTable out "D:\data.csv" -T -c -C 65001 -t , ...

1
সার্ভারনাম = আপনার কম্পিউটার কম্পিউটারনাম \ এসকিউএল সার্ভারনাম, কেবল তখনই এটি অন্যথায় ত্রুটি কার্যকর করে
হামাদ খান

1
আপনি যদি bcp.exe এর জন্য সম্পূর্ণ ডকুমেন্টেশন দেখতে চান: টেকনিকট.মাইক্রোসফট /en-us/library/ms162802.aspx
রবার্ট বার্নস্টেইন

5
আপনি যদি শিরোনাম হিসাবে কলামের নামগুলি রফতানি করতে চান তবে আপনি কী করবেন? বিসিপি ব্যবহার করে কি কোনও সোজা জেনেরিক সমাধান রয়েছে?
আইয়েন স্যামুয়েল ম্যাকলিন এল্ডার

@ জোহান্দাকোস্টা অনেক ধন্যবাদ আপনি কলামের শিরোনামগুলি কীভাবে মুদ্রণ করবেন? আমি এটি কোথাও একটি সহজ স্যুইচ দেখতে পাচ্ছি না। ধন্যবাদ!
রাচেল

1
bcpশিরোনাম (কলামের নাম) অন্তর্ভুক্ত করে না, তবে এটি sqlcmd(আমার অভিজ্ঞতা থেকে) ~ 10X দ্রুত । সত্যিই বড় ডেটার জন্য, আপনি ডেটা bcpপেতে ব্যবহার করতে পারেন , এবং শিরোনামটি পেতে sqlcmdশীর্ষস্থান নির্বাচন করুন (...
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 ^ \ - [, \ -] * $> আউটপুট.সিএসভি কোনও কারণে একক sim [, \ -] * all সমস্ত লাইনের সাথে মেলে।
ভ্লাদিমির কোরোলেভ

3
সর্বদা double ডাবল উদ্ধৃতিগুলির ভিতরে একটি রেজেেক্স রাখুন, বা আপনি অদ্ভুত ফলাফল পান, কারণ cm সেমিড.এক্সএক্সের জন্য একটি পালানোর চরিত্র। উপরের দুটি রেজেক্সস যথাযথভাবে কাজ করে না, যতদূর আমি বলতে পারি, তবে এটি করে: findstr / r / v "^ - [-,] * -। $" (।। এর আগে testing পরীক্ষা করার সময় মনে হয় যে এটি প্রয়োজন ছিল প্রতিধ্বনিত, তবে স্ক্যুয়েলসিএমডি আউটপুট জন্য নাও থাকতে পারে)
জিমজি

তারিখগুলির সাথে একটির পরিবর্তে তারিখ এবং সময়ের মধ্যে 2 স্পেস থাকার সমস্যা রয়েছে। আপনি যখন এক্সেলে সিএসভি খোলার চেষ্টা করেন, এটি 00: 00.0 হিসাবে প্রদর্শিত হয়। এটি সমাধানের একটি সহজ উপায় হ'ল এসইডি ব্যবহার করে "" স্থানে সমস্ত "" অনুসন্ধান এবং প্রতিস্থাপন। আপনার স্ক্রিপ্টে যুক্ত করার কমান্ডটি হ'ল: SED -i "s / / / g" আউটপুট সিএসভি। এসইডি gnuwin32.sourceforge.net/packages/sed.htm
PollusB

এটি সঠিক উত্তর, @ জিমজি যোগ করার সাথে নিখুঁতভাবে কাজ করে। আমি বিভাজনের জন্য সেমিকোলন এবং ইনপুটগুলির জন্য একটি এসকিএল ফাইল ব্যবহার করেছি, সেই ফাইলটিতে ননকাউন্টটি রয়েছে এবং অ্যানিসি-ওয়ার্নিং অংশ নেই, এবং স্থান অপসারণের জন্য
-W

1

এই উত্তরটি @ আইয়েন-প্রবীণের কাছ থেকে সমাধানটির উপর ভিত্তি করে তৈরি করা হয়েছে, এটি বৃহত ডাটাবেস কেস (তাঁর সমাধানে উল্লিখিত হিসাবে) ব্যতীত ভাল কাজ করে। পুরো টেবিলটি আপনার সিস্টেমের স্মৃতিতে ফিট করা দরকার এবং আমার জন্য এটি কোনও বিকল্প ছিল না। আমি সন্দেহ করি যে সর্বোত্তম সমাধানটি System.Data.SqlClient.SqlDataReader এবং একটি কাস্টম সিএসভি সিরিয়ালাইজার ( উদাহরণ হিসাবে এখানে দেখুন ) বা এমএস এসকিউএল ড্রাইভার এবং সিএসভি সিরিয়ালাইজেশন সহ অন্য কোন ভাষা ব্যবহার করবে। মূল প্রশ্নের মধ্যে যা সম্ভবত কোনও নির্ভরতার সমাধানের সন্ধানে ছিল না, নীচের পাওয়ারশেল কোডটি আমার পক্ষে কাজ করেছিল। বিশেষত $ ডেটা অ্যারেটি ইনস্ট্যান্ট করতে এবং প্রতিটি $ শঙ্ক_সাইজ লাইনের জন্য অ্যাপেন্ড মোডে এক্সপোর্ট-সিএসভি কল করার ক্ষেত্রে এটি খুব ধীর এবং অদক্ষ।

$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 ফাইলে ডাম্প করতে এখানে বাশ স্ক্রিপ্টটি দেওয়া হয়েছে:

#!/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কিছু পাওয়ারশেলের বিকল্পের পক্ষে পুরানো এটি ভুলে যাচ্ছেন যে sqlcmdএটি কেবল উইন্ডোজের পক্ষে নয়। আমি লিনাক্সে আছি (এবং যখন উইন্ডোজ থাকি তখন আমি পিএস এড়িয়ে যাই)।

সব বলার পরেও, আমি bcpআরও সহজ মনে করি।


0

২ টি কারণ অনুসরণ করার পরে, আপনার আমার সমাধানটি সিএমডিতে চালানো উচিত:

  1. কোয়েরিতে ডাবল উদ্ধৃতি থাকতে পারে
  2. লগইন ব্যবহারকারীর নাম এবং পাসওয়ার্ড কখনও কখনও একটি দূরবর্তী এসকিউএল সার্ভার উদাহরণ জিজ্ঞাসা করা প্রয়োজন

    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!")

উত্স: ভিবিএস স্ক্রিপ্ট সহ সিএসভিতে এসকিউএল আউটপুট লেখা


1
ডাউনভোটের জন্য একটি ব্যাখ্যা সুন্দর হবে। আমার উত্তর সঠিক: আপনি sqlcmd দিয়ে এটি করতে পারবেন না। আমি কাজটি সম্পাদনের জন্য বিকল্প উপায়ও দিয়েছিলাম।
সেরেল বোথা

4
ডাউনভোটটি হ'ল কারণ আপনি স্পষ্টতই স্কেল সিএমডি দিয়ে ওপিকে যা বলতে চাইছেন তা করতে পারেন।
ব্রায়ান ড্রিসকল

2
ব্রায়ানড্রিসক্ল, তিনি বলেননি যে এটির মাধ্যমে কেউ তা করতে পারে নাsqlcmd , আমরা কেবল এই সত্যটিই জানিয়েছিলাম যে sqlcmdকমা থেকে সঠিকভাবে পালাচ্ছে না, সুতরাং কোনও গুরুতর সিএসভি আউটপুট জন্য সবেমাত্র ব্যবহারযোগ্য able
সেবাস্তিয়ান

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