クエリ結果をSQL Server 2008の.csvファイルにエクスポートする


141

SQL Server 2008でクエリ結果を.csvファイルにエクスポートするにはどうすればよいですか?



区切り文字をエスケープする必要がありますか?これまでのほとんどの回答では、そうではないと想定していますが、これは実際にはすべてのCSVではありません。
Nick

@Nick-通常、区切り文字は文字列のみで含まれ、通常は引用符で囲まれます。これに対する解決策を見るには私の答えを見てください。 stackoverflow.com/questions/6115054/…–
MacGyver


私は時々Pythonを使用します
LV98

回答:


168
  1. SQL Server Management Studioを開く
  2. [ツール]> [オプション]> [クエリ結果]> [SQL Server]> [テキストへの結果]に移動します
  3. 右端に、出力フォーマットと呼ばれるドロップダウンボックスがあります
  4. カンマ区切りを選択し、[OK]をクリックします

以下がその画像のフルスクリーン版です。

ここに画像の説明を入力してください

これにより、クエリ結果がカンマ区切りのテキストとして表示されます。

クエリの結果をファイルに保存するには:Ctrl + Shift + F


10
答えは少し誤解を招くようです...を押すCtrl+Shift+Fと、出力モードが変更されるだけで、すでにクエリを実行している場合は結果に影響しません。これを反映させるには、クエリを再実行する必要があります。「結果をファイルに保存」モードで実行すると、結果を保存する場所を指定するよう求められます。
qJake 14

3
[ツール]> [オプション]> [クエリ結果]> [ SQL Server] > [テキストへの結果]に移動する必要があります
congusbongus

45
クエリを再実行するだけでは不十分でした。クエリウィンドウを閉じて新しいウィンドウを開き、クエリを再度実行する必要がありました。
Breandán

3
@Breandánコメントを確認しました。新しい設定は現在開いているクエリウィンドウには適用されません。それらを閉じてクエリを再実行する必要があります。
Shinigamae

3
私がしなければならないことの1つは、それをデフォルトのRPT拡張としてエクスポートすることでした。その後、名前をCSVに変更するだけで機能します。
トーマスベネット

140

私はこれが少し古いことを知っていますが、これははるかに簡単な方法です...

  1. デフォルト設定でクエリを実行します(グリッド形式で結果を出力します。グリッド形式でない場合は、以下を参照してください)

  2. グリッドの結果を右クリックし、[名前を付けて結果を保存]をクリックして保存します。

結果がグリッド形式でない場合は、クエリを書き込む場所を右クリックし、[Results To]にカーソルを合わせて[Results To Grid]をクリックします

列ヘッダーはキャプチャしないでください。

幸運を!


1
唯一の問題は、この方法ではオプションを設定できないように見えることです。たとえば、すべてのNULLは出力ファイルに「NULL」などとして表示されます。おそらく、これを設定する方法がわからないのかもしれません。
ノア

13
SSMS 2012でも驚くほど、これはCSVのテキストを適切に引用しません。CHAR / VARCHAR内のコンマまたは改行は引用符で囲む必要がありますが、そうではありません。これにより、データが新しい列または新しい行にシフトします。
Eric J.

4
また、列ヘッダーは提供されません。
Don

8
@Donこれは、[クエリ]-> [クエリオプション...]、グリッドタブに移動して[結果をコピーまたは保存するときに列ヘッダーを含める]をオンにすると、列ヘッダーが表示されます
Rob Wise

7
これが答えになるはずです。
pspahn 2015

46

PowerShellを使用できます

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

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

ありがとうございました!これは私にとって有効な唯一の提案でした。エスケープを適切に処理する
emertechie 2013

3
できれば+10。エスケープを処理する答えのみ。これを実行するには、スクリプトの上部に2行追加する必要が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必要がありました(ただし、これらのコマンドレットをスナップインする必要はありませんでした)。また、コマンドをスクリプトに保存したため、実行ポリシーを変更するまで実行されませんでしたSet-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope CurrentUser
サンディスコット

@sandyscott私もPowershellの初心者なので、ありがとうございます。とにかく、この場合はRemoteSigned実行ポリシーで十分だと思います。
BigBother

14

問題のデータベースがローカルである場合、おそらくクエリ結果をCSVファイルにエクスポートする最も強力な方法は次のとおりです(つまり、ほとんどの制御が可能です)。

  1. クエリをコピーします。
  2. オブジェクトエクスプローラーで、問題のデータベースを右クリックします。
  3. [タスク] >> [データのエクスポート...]を選択します
  4. データソースを設定し、[次へ]をクリックします。
  5. 宛先として「フラットファイル」または「Microsoft Excel」を選択します。
  6. ファイルパスを指定します。
  7. フラットファイルを使用する場合は、必要に応じて構成します。Microsoft Excelを使用している場合は、[Excel 2007]を選択します(以前のバージョンでは、行数が64kに制限されています)
  8. 「クエリを記述して転送するデータを指定する」を選択します
  9. 手順1のクエリを貼り付けます。
  10. 次へ>>マッピングを確認>>次へ>>「すぐに実行」を選択>>「完了」を2回クリック

このプロセスを徹底的に検討した後、私は以下が最良の選択肢であることがわかりました

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

NSの答えに基づいて、フィールドを引用符で囲み、コンマで区切ってCSVファイルにエクスポートするPowerShellスクリプトを作成し、ファイルのヘッダー情報をスキップします。

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"

最初の2行は、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

SSMSは値を二重引用符でラップしないため、値にコンマが含まれている場合、ネイティブのSQL Server Management Studioテクニックを使用してCSV(@ 8kbを推奨)にエクスポートすることはできません。私のために機能したより堅牢な方法は、結果をコピーして(グリッド内をクリックしてからCTRL-A、CTRL-Cをクリックする)、Excelに貼り付けることです。次に、ExcelからCSVファイルとして保存します。


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リンクサーバー "(null)"のOLE DBプロバイダー "Microsoft.ACE.OLEDB.12.0"のデータソースオブジェクトを初期化できません。 "

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

2

メッセージ15281、レベル16、状態1、行1 SQL Serverは、コンポーネント 'アドホック分散クエリ'のステートメント 'OpenRowset / OpenDatasource'へのアクセスをブロックしました。このコンポーネントがこのサーバーのセキュリティ構成の一部としてオフになっているためです。システム管理者は、sp_configureを使用して「アドホック分散クエリ」の使用を有効にすることができます。「アドホック分散クエリ」の有効化の詳細については、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を選択する代わりに、タブ区切りを選択することです。この方法では、データにカンマがある場合、Excelのセルはスキップされません。また、Excelのデフォルトの区切り文字がタブに設定されている場合は、SSMSクエリの結果(CTRL-A、CTRL-C)をすべてコピーしてExcelに貼り付けることができます(ファイルとして保存してExcelにインポートする必要はありません) ):

  • SSMSで、[ツール]> [オプション]> [クエリ結果]> [SQL Server]> [テキストへの結果]に移動します。
  • 右端の出力形式をタブ区切りに変更
  • OKをクリックします

これでクエリを実行し、CTRL-Aを実行してすべての結果を選択し、CTRL-Cを使用してクリップボードにコピーし、Excel 2013に切り替えて(2007でも機能する可能性があります)、貼り付けます-Excelのデフォルトを想定区切り文字はタブに設定されています。

SSMSクエリオプション画面の画像


-1

はい、サーバーに直接アクセスできる場合、これらすべてが可能です。しかし、Webサーバーまたはアプリケーションサーバーからサーバーにのみアクセスできる場合はどうでしょうか。ええと、状況は私たちとの長い間の関係であり、解決策はSQL Server Export to CSVでした。


リンク...アクセスが拒否されましたか?
hoggar
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.