• 締切済み

サーバーと実行端末が違う場合のsqlcmdの書き方

コマンドの実行端末にDBがある場合は成功するのですが、 サーバーが別の端末の場合ファイルが見つからないようです。 データファイルの書き方を変える必要があるのでしょうか? SQLServerは2008です。 SQLCMD -S"SRV\XXXXXX" -U"user" -P"pass" -d"DB1" -Q"INSERT INTO [テーブル名] SELECT CONVERT(datetime,年月),データ1,データ2,データ3,データ4 FROM OPENROWSET(BULK 'D:\test\bcptest\test.csv', FORMATFILE='D:\test\bcptest\test.fmt',FIRSTROW = 2) x"

みんなの回答

  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.3

BCPユーティリティと、sqlcmdユーティリティによるOPENROWSETの違いを認識していただく必要があります。 BCPユーティリティによるINSERTはBCPを実行している端末で行われますが、OPENROWSETはそのクエリが実行されるサーバで行われます。そして、sqlcmdユーティリティは「指定したサーバでのSQL文実行を指示する」ものに過ぎないので、結局後者の方法はサーバにあるファイルを読むことが前提になっているのです。 もともと質問者さんが最初にBCPを使おうとしてできなかったときにも私が回答したのですが、フォーマット変換の難しいファイルを読み込もうとしていたので、SQL Serverがローカルにあることを確認した上で、より柔軟性の高いOPRNROWSETをお勧めしたということです。 前述の通り、本質的な違いがありますから、sqlcmdのローカルフォルダにあるファイルをそのまま指定したところで実現できません。どうしてもという場合は、ローカルフォルダを共有してサーバからアクセスさせる必要があります。 http://msdn.microsoft.com/ja-jp/library/ms175915.aspx ただし、そのような使い方(サーバからクライアントの共有フォルダにアクセスする)が想定されたものになるはずがありませんので、その場合はどうしてもBCPを使わなくてはならないでしょう(もしくはSSISか)。フォーマットの問題は一時テーブルを使うなどして回避するしかないと思います。

taku_pon
質問者

補足

ありがとうございます。 本番はDBサーバーのマシンでコマンドを実行するので 問題ないのですが、テスト中は自分の端末でプログラムを開発しています。 プログラムからコマンドファイルを実行するので 自分の端末にコマンドファイルを持ってきています。

  • norayuni
  • ベストアンサー率79% (27/34)
回答No.2

> サーバーが別の端末の場合ファイルが見つからないようです。 そのPCには、sqlcmd.exeが存在していますか。 そのPCにSQL Serverがらみの何かをインストールしていれば大丈夫ですが、全く関係していない場合、sqlcmd.exeが存在しないので当然実行できません。 ない場合は、Express edition with advanceなどをインストールするのが手っ取り早いです。 あって、sqlcmdが無効な場合は環境変数に、sqlcmdがあるフォルダパスがあるか確認してみてください。

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

> 'D:\test\bcptest\test.csv', FORMATFILE='D:\test\bcptest\ どの端末にもフォルダ[D:\test\bcptest\]が存在するのですか? 「フォルダを共有してUNCパスで記述する」とか、他端末からも参照できる状況にする必要があると思います。

taku_pon
質問者

補足

>どの端末にもフォルダ[D:\test\bcptest\]が存在するのですか? 自分の端末(コマンドファイルの実行端末)にのみ存在します。 サーバーのDBに自分の端末にあるデータファイルをアップロードする イメージになります。 コマンドファイルを実行する端末は自分の端末でも サーバーにデータファイルがあるか探してしまう仕様なのでしょうか? サーバーは仮想化された別の端末です。 SQLServer2008がインストールされています。

関連するQ&A