• 締切済み

OPENROWSET関数を使用したインサート方法

現在「vs.net2010 C#」を使用してプログラムを作成しております。 連携するデータベースに「SQL server2010 R2」を使用し、以下の構成のエーブルへデータをインサートしたいと思っているのですが、2点どうしても解決出来ない問題が発生してしまいどうにも原因が分からない状態です。 初心者の為、初歩的な事があまり分かっておらず、大変恐縮ですが、対応方法をご存じの方がいらっしゃいましたら、ご教授頂ければと思います。 ■テーブル構成 テーブル名:test ・ID UNIQUEIDENTIFIER PRIMARY KEY ・FILE_NAME1 VARCHAR(20) ・FILE_DATA1 VABINARY(MAX) ・FILE_NAME1 VARCHAR(20) ・FILE_DATA1 VABINARY(MAX) ■発生している問題 (1)webアプリの画面からファイルを参照し、そのファイルパスを取得し、インサートの際に利用しているのですが、パスの間にスペースが入っている為か下記のようなエラーが発生してしまいます。 ・実行SQL insert into test (ID ,FILE_NAME1 ,FILE_DATA1 ,FILE_NAME1 ,FILE_DATA1) select NEWID() ,null ,null ,'Book1.xls' ,x.* from OPENROWSET(BULK N'C:\Documents and Settings\USER\デスクトップ\Book1.xls', SINGLE_BLOB)AS x 「ファイル"ファイルパス"を開けなかったので、一括読み込みできません。オペレーティングシステムエラーコード 5(アクセスが拒否されました)」 C:直下等にファイルを移し実行すると正常にインサート出来るので、パスのスペースが原因だと考えているのですが、解決策を調べてもよくわかりませんでした・・・ (2)インサートの際に「VABINARY」列が複数ある時の記述方法について 1 insert into test 2 (ID 3 ,FILE_NAME1 4 ,FILE_DATA1 5 ,FILE_NAME1 6 ,FILE_DATA1) 7 select 8 NEWID() 9 'Book1.xls' 10 ,x.* from OPENROWSET(BULK N'C:\Documents and Settings\USER\デスクトップ\Book1.xls', SINGLE_BLOB)AS x 11 ,'Book2.xls' ,12 y.* from OPENROWSET(BULK N'C:\Documents and Settings\USER\デスクトップ\Book2.xls', SINGLE_BLOB)AS y 上記のように「VABINARY」列が複数ある時に、上の9.10行目は問題ないようなのですが、以下の11.12行目が構文エラーとなってしまいす。 本当は12行目以降にも、新しく列を作成し、インサートしたいと思っておりますが、10行目以降は 初歩的な記述方法の問題かとは思うのですが、自身の理解不足も相まって調べても解決できない状態です。 どなたかお力をお貸し頂けませんでしょうか? 以上、宜しくお願い致します。

みんなの回答

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

1.パスのスペースが問題ではなく、指定先が特定ユーザしかアクセスできないフォルダ(デスクトップなど)であることが問題だと考えられます。  OPENROWSETを実行するユーザは、今それをログインしているユーザ(=デスクトップのユーザ)ではなく、SQL Serverのサービスを動かしているユーザであるため、単純にアクセス権限がないのだと思います。 2.書式は以下の通りとなります。 SELECT NEWID() ,'Book1.xls' ,(SELECT x.* FROM OPENROWSET(BULK N'C:\Documents and Settings\USER\デスクトップ\Book2.xls', SINGLE_BLOB)AS x) ,'Book2.xls' ,(SELECT y.* FROM OPENROWSET(BULK N'C:\Documents and Settings\USER\デスクトップ\Book2.xls', SINGLE_BLOB)AS y) ただ、このように1行に2つvarbinaryのデータを持たせるテーブルデザイン自体がよいとは言えません。 蛇足になるかもしれませんが・・。 本件はWebアプリといいつつ、そのアプリとSQL ServerがインストールされているPC自体でオペレーションしているだけのようです。 他のPCからこのWebアプリを使用したときは、SQL Serverの入っているPCにファイルを送らないとOPENROWSETはできませんので、ご注意ください。

関連するQ&A

  • BULK INSERT

    BULK INSERTを使ってテーブルにデータを入れようとしているのですが、ファイルデータしか取り込めないのでしょうか? プログラム(C++)で生成したテーブルデータをオンメモリで引き渡してBULK INSERTとか出来ないでしょうか?

  • エクセルのマクロで、他のブックを開くときについて

    マクロの記録を利用して、他のブックを開くことをしました。 マクロのモジュールを見たら、 ChDir "C:\Documents and Settings\*****\デスクトップ" Workbooks.Open Filename:="C:\Documents and Settings\*****\デスクトップ\○○.xls" となっていました。 1行目の「Chdir」というのはなんでしょう? また、2行目では開きたいブックをパスを使ってあらわしています。 今マクロを動かしているブックと同じフォルダ内にあるブックや そのフォルダから見て上位のフォルダとか、「c:」から始まる パスを使わないような書き方はあるのでしょうか? ご助言お願いします。

  • ダイアログボックスから関数と変数の挿入

    ダイアログボックスから名前とID番号を入れると最下行にその名前とIDになった関数がセルの中に挿入されるようにするにはどうすればいいのでしょうか? B50='C:\Documents and Settings\Owner\デスクトップ\[(1022徳川家康).xls]Sheet1'!$A$2 B51='C:\Documents and Settings\Owner\デスクトップ\[(1022徳川家康).xls]Sheet1'!$A$3 B52='C:\Documents and Settings\Owner\デスクトップ\[(1022徳川家康).xls]Sheet1'!$A$4 たとえばB50、B51、B52のセルに上記な関数を総合という名前のブックに作成しています。 それは1022徳川家康ブックから読み込まれます。 総合というブックにダイアログボックスがあり織田信長という名前とID1023を入れると B60='C:\Documents and Settings\Owner\デスクトップ\[(1023織田信長).xls]Sheet1'!$A$2 B61='C:\Documents and Settings\Owner\デスクトップ\[(1023織田信長).xls]Sheet1'!$A$3 B62='C:\Documents and Settings\Owner\デスクトップ\[(1023織田信長).xls]Sheet1'!$A$4 と言うように入力したいと考えています。 ダイアログボックスを使用しないで作成する方が良いのかも良くわかりませんが、このようなものは作成できるでしょうか? よろしくお願いいたします。

  • BULK INSERTで失敗

    いつも拝見させて頂いております。 今回はSQLServerのBULK INSERTについて質問させていただきます。 現在、UNIXから出力されたデータファイルをWindows2000Serverにて ストアドからBULK INSERTを使用して取り込もうとしています。 ですが、うまく取り込めず困っています。 現在は『BULK INSERT TBL名 FROM 'サーバ内のファイル'』として クエリアナライザからも実行しているのですが、最後のカラムで 桁あふれとなりエラーが発生してしまいます。 行終端文字が認識できず、全てのデータが1行とみなされているようです。 しばらく、調べているのですが調べれば調べるほど正常に取り込めなければ おかしいと思ってしまっています。 以下が現在の状況です。 1.BULK INSERTの行終端文字のデフォルトは\n(LF)であり、   取り込もうとしているデータファイルの行終端文字も\n(LF)である。 この状況であれば取り込めるかカラムのデータ型不一致等のエラーまで進むと思っているのですが、そこまで進みません。どなたかこのような状況を経験したら方が いらっしゃいましたらご教授いただきたく存じます。 宜しくお願い致します。

  • SQL SERVERの BULK INSERT

    SQL SERVERの BULK INSERTについて。 TESTというテーブルにtest.csvをBULK INSERTによりデータをインポートしようとしているのですが変数を使わずに下記のように書くと正常に動くのですが、 BULK INSERT TEST FROM 'C:\data\test.csv' WITH ( FIELDTERMINATOR = ',', ROWTERMINATOR = '\n' ) 変数を使って下記のようにすると「不適切な構文があります。」とエラーとなってしまいます。 DECLARE @data varchar(100) SET @data = 'C:\data\test.csv' BULK INSERT TEST FROM @data WITH ( FIELDTERMINATOR = ',', ROWTERMINATOR = '\n' ) 解決策を教えてください。

  • INSERT,DELETEを同時に

    $sql = "INSERT INTO daykg(id,name,day,kg)select distinct id,name,'$day','-1'from daykg"; $sql = "DELETE FROM daykg WHERE distinct ORDER BY day DESC LIMIT 5,1"; 上で会員全員にインサート、下で会員全員の五行目から一行削除としているつもりですが、合ってますか??

    • ベストアンサー
    • PHP
  • excel2000マクロ抽出方法

    2つのファイルがあります。ブック名A.XLS シート名 WORK              ブック名b.XLS シート名 SORT              ブック名A.XLS シート名 WORKに下記のデータが入っています。 AD 1300G A227550 000PA505(C列2行目) 200112(F列)200201(G列)200202(H列)200203(I列)200204(J列)200205(K列)→1行目固定データ AD 1300G A227550 000PA533(C列3行目)   ブック名b.XLS シート名 SORTに下記のデータが入っています。 AD 1300G A227550 000PA505(A列2行目)200112(E列)200201(F列)200202(G列)200203(H列)200204(I列)200205(J列) →1行目E列~J列のデータは都度変わっている AD 1300G A227550 000PA533(A列3行目)    データ抽出条件  ブック名A.XLS シート名 WORKの F列~K列の1行目の列データとブック名b.XLS シート名 SORTの  E列~J列の1行目の列データが同じで、ブック名A.XLS シート名 WORKのC列の2行目以降のコードと  ブック名b.XLS シート名 SORTのA列の2行目以降のコードが同じだったら  ブック名b.XLS シート名 WORKの E列~J列の同じ行にデータを入れる。違うときは、  ブック名b.XLS シート名 WORKのデータはそのままにする。 上記の条件を満たしたマクロの記述の仕方を教えてください。 以上よろしくお願いします。

  • PHP+MYSQLの画像の書き込み

    PHPでMYSQLにblob型へJPGを格納したいのですが、<INPUT type="file" name="file">でPOSTしたのを insert文で$_POST['file']で書き込んでもMYSQLのテーブルを見ても書き込まれていません。 base64でエンコードしないとだめなのでしょうか? 簡単なサンプルが知りたいです。

    • 締切済み
    • PHP
  • ドライブレターとは?パスの文字数とは?

    C:\Documents and Settings\user\My Documents\Excel\file.xls というファイル名があった場合、 ドライブレターというのは「C:」のことでしょうか? また、このパスの文字列を数える場合、 「C:」は抜いて数えるのでしょうか? 「\」も一文字として数えるのでしょうか? どうも初心者ですみませんがどなたか教えてください。

  • 統合マクロでパスの取得方法

    お世話になります。 集計ファイルでエリア・商品で集計をとっています。 一つのファイルにまとめたいのでエリアをシート名による串刺し 商品を統合を使って集計していますが 毎回統合ボタンを押すのが大変で マクロを使い下記のコードを使っていますがファイルのパスで固定されているので 人に渡すとファイル名の変更、ユーザーの違いによりエラーになってしまいます。 現在開いているファイルの名前とパスをマクロに取り込み統合させる事は可能でしょうか Sub Macro1() ' ' Macro1 Macro ' マクロ記録日 : 2009/9/29 ユーザー名 : user ' ' Sheets("一般A").Select Range("b6").Select Selection.Consolidate Sources:=Array( _ "'C:\Documents and Settings\user\デスクトップ\[8期資料.xls]〇〇一般A'!R6C2:R64C9", _ "'C:\Documents and Settings\user\デスクトップ\[8期資料.xls]□□一般A'!R6C2:R64C9", _ "'C:\Documents and Settings\user\デスクトップ\[8期資料.xls]△△一般A'!R6C2:R64C9", _ "'C:\Documents and Settings\user\デスクトップ\[8期資料.xls]××一般A'!R6C2:R64C9", _ "'C:\Documents and Settings\user\デスクトップ\[8期資料.xls]●●一般A'!R6C2:R64C9", _ "'C:\Documents and Settings\user\デスクトップ\[8期資料.xls]■■一般A'!R6C2:R64C9", _ "'C:\Documents and Settings\user\デスクトップ\[8期資料.xls]▲▲一般A'!R6C2:R64C9", _ "'C:\Documents and Settings\user\デスクトップ\[8期資料.xls]++一般A'!R6C2:R64C9", _ "'C:\Documents and Settings\user\デスクトップ\[8期資料.xls]※※一般A'!R6C2:R64C9", _ "'C:\Documents and Settings\user\デスクトップ\[8期資料.xls]%%一般A'!R6C2:R64C9"), _ Function:=xlSum, TopRow:=False, LeftColumn:=False, CreateLinks:=False Sheets("一般B").Select Range("b6").Select Selection.Consolidate Sources:=Array( _ "'C:\Documents and Settings\user\デスクトップ\[8期資料.xls]〇〇一般B'!R6C2:R64C9", _ "'C:\Documents and Settings\user\デスクトップ\[8期資料.xls]□□一般B'!R6C2:R64C9", _ "'C:\Documents and Settings\user\デスクトップ\[8期資料.xls]△△一般B'!R6C2:R64C9", _ ・ ・ ・ ・ End Sub DIMとかActiveWorkbook.Pathとか組み込みましたが うまく行かないです。 どうぞ助けてください。