• ベストアンサー
  • 困ってます

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' ) 解決策を教えてください。

共感・応援の気持ちを伝えよう!

  • SQL Server
  • 回答数1
  • 閲覧数2306
  • ありがとう数7

質問者が選んだベストアンサー

  • ベストアンサー
  • 回答No.1
  • todo36
  • ベストアンサー率58% (728/1234)

共感・感謝の気持ちを伝えよう!

質問者からのお礼

リンク先のページを参考にしたところうまくいきました。ありがとうございました。

関連するQ&A

  • BULK INSERTについて

    CSVをバルクインサートでitemテーブルにBULK INSERTする際に、 下記のようなSQL文を使っているのですが、CSV内のブランク文字は 実行後にNULLになってしまいます。 やりたいことはNULLではなく空白文字("")にしたいのですが、 下記のSQL文をどのように変えればよいのでしょうか。 または、CSVを変更する方法でもよいです。 BULK INSERT item FROM 'c:\test.txt' WITH ( FIELDTERMINATOR = ',', ROWTERMINATOR = '\n' ); 大変お手数ですが、 わかる方がいらっしゃいましたらよろしくお願いいたします。

  • 文字列の長さを指定して BULK INSERT するには?

    20,1899-12-3020,1899-12-3020,1899-12-3020,1899-12-30 このような文字列がファイルにあるのですが、 1899-12-30 の部分を、文字数10と指定して データを取り出すことは可能でしょうか? この場合のデータは年齢と生年月日です。 BULK INSERT INTO [BIRTHDAY] FROM 'C:\sql\birthday.txt' WITH (FIELDTERMINATOR = ',', ROWTERMINATOR = '')

  • MS-SQLプロシージャでファイルを削除したい

    お世話になります。 SQL Server 2005のプロシージャにて テーブルの削除→CSVファイルの取り込み→CSVファイルの削除を行いたいと思っております。 ALTER PROCEDURE [dbo].[テーブル削除+インポート+ファイル削除] AS begin DELETE FROM dbo.テーブル BULK INSERT テーブル FROM 'テキストファイル' WITH (DATAFILETYPE='char', FIELDTERMINATOR=',',ROWTERMINATOR='\n') end ここで、テーブル削除とCSVファイルのインポートはできたのですが、ファイルの削除が未だにできません。 このあとテキストファイルをこのプロシージャ内で削除するにはどうすればよいでしょうか。

  • BULK INSERT

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

  • SQL ServerにCSVをインポート

    SQL Server Express 2012にCSVファイルのデータをインポートさせたいと思っています。 SQL Server のデータのうち、主キーはdate型、その他はbit型、nvarchar型です。 SQL Serverのテーブルのデータには、#2013-01-01#, #False#, "あいう"などというデータがあります。 CSVは、Event.csvというデータです。 インポートするにあたって、BULK INSERTを利用しようとしています。 上記のデータで下記のコードをSQL Server Managemant Studio Expressで実行するとエラーとなります。 FROM 'D:\Business\Data\Event.csv' WITH ( FIELDTERMINATOR = ',', ROWTERMINATOR = '\n' ); データを別の文字列にするべきなのか、#で日付やブール値を囲わない方がよいのか、あるいはカラム名の入ったCSVを用意するべきなのかなど、疑問が多いのですが、実際はどうあるべきなのでしょうか。 なお、上記のデータはもともとExcel のデータをVBAを使ってCSVファイルに出力したものなので、CSVの形式を別の状態のデータに変換することはできます。 もともとの目的は、ExcelのデータをSQL Serverのデータにインポートしたいだけです。 よろしくお願い致します。

  • 【 困 】 ストアドプロシージャ

    OS:WIN2000 DB:SQLServer2000 下記のストアドプロシージャを作成しました。 BULK INSERTを使っています。 引数でCSVファイルのパスを渡そうとしています。 「エラー170:行5: '@Query'の近くに無効な構文があります。」 というエラーになってしまいます。 5行目にあるFromの次に変数を書くには、どうしたらいいのでしょうか? CREATE proc SP_BULK_INSERT @Query char(100) AS BULK INSERT T_顧客マスタ FROM @Query WITH (FIELDTERMINATOR = ',') GO

  • BULKINSERTのWITHオプションについて

    SQLserver 2005 Expressを使用してます。 csvをBULKINSERTでインポートする際にcsvの最終行に終了コードのようなデータが 入っていてインポートに失敗します。 BULKINSERTのWITHオプションのLASTROWの引数に変数を使用して 日々行数の変化するcsvの最終行-1の値をセットしたいのですが構文エラーに なります。どのように記述したらいいのでしょうか? 試した事は test.csv 1,あ,4200 2,い,5300 . ← 何かのデータ CREATE PROCEDURE [dbo].[test1] AS bulk insert test_table from 'C:\test.csv' with (firstrow = 1,formatfile = 'C:\Import_Fmt.xml') で実行するとエラー「一括読み込み: データ ファイルで予期しないファイルの終了が検出されました。」になるので、最終行の「.」が原因かと思い。 ALTER PROCEDURE [dbo].[test1] AS bulk insert test_table from 'C:\test.csv' with (firstrow = 1,lastrow = 2,formatfile = 'C:\Import_Fmt.xml') で実行するとエラー無くインポートされました。 実際のcsvは行数10000件はあり日々増減しますので毎回手作業で数えることは難しいです。 そこで一度仮テーブルを作り改行コードまでを一つのカラムにインポートして 行数をカウントし、変数にセットしてLASTROWの引数に渡そうとして ALTER PROCEDURE [dbo].[test1] AS declare @maxseq as int drop table test2 create table test2(F1 varchar(max)) bulk insert test2 from 'C:\test.csv' with (firstrow = 1,formatfile = 'C:\ImportOrg_Fmt2.xml') set @maxseq = (select count([F1]) from test2) --ここにreturn @maxseqを記述して以降を削除して実行し、ストアドを実行したら       --取り込んだcsvの行数が表示されました。 bulk insert test_table from 'C:\data\test.csv' with (firstrow = 1,lastrow = @maxseq -1 ,formatfile = 'C:\ImportOrg_Fmt.xml') と記述して実行すると メッセージ 102、レベル 15、状態 1、プロシージャ test1、行 23 '@maxdeq' 付近に不適切な構文があります。 となりました。 どのように記述したら構文エラーにならずに実行できるかご回答をよろしくお願いします。

  • BULK INSERTで失敗

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

  • プロシージャの引数について

    DB : SQL Server 2005 プロシージャの引数にCSVファイルのフルパスを入れたいのですが、 エラーが出て困っています。 http://questionbox.jp.msn.com/qa262720.html ↑の回答も参考にしましたが、どうしても出来ません。 最初は以下のように書いていました。 BULK INSERT IDATA from ''+ @pass + '' with ( fieldterminator = ',', rowterminator = '\n' ) このときは、プロシージャを作る段階で↓のエラーメッセージが出ました。 >メッセージ 1038、レベル 15、状態 1、プロシージャ sss、行 30 オブジェクト名または列名がないか、空です。SELECT INTO ステートメントの場合は、各列に名前が付いていることを確認してください。その他のステートメントの場合は、空の別名を検索してください。"" または [] で定義された別名は許可されません。別名として、名前または 1 つのスペースを追加してください。 >メッセージ 319、レベル 15、状態 1、プロシージャ sss、行 30 キーワード 'with' 付近に不適切な構文があります。このステートメントが共通テーブル式または xmlnamespaces 句の場合、前のステートメントをセミコロンで終了してください。 また、上記の回答を参考にしたところ、プロシージャは作成できましたが、 引数を与えて実行する段階で↓のエラーメッセージが出ました。 >メッセージ 203、レベル 16、状態 2、プロシージャ sss、行 32 名前 'BULK INSERT IDATA from '\\・・・\・・・\取込.csv' with ( fieldterminator = ',',rowterminator = '\n')' は有効な識別子ではありません。 引数で与えるのでなく、直接入力した場合は出来ます。 よろしくお願いします (><)

  • BULK INSERTのエラー取得は可能なのでしょうか?

    こんばんは。 お世話になります。 SQL Server初心者です。 現在、CSVファイルに出力された他のデータベース(Paradox)のデータをSQL Server2005に移行するためのツールを作成しています。 Paradoxでは、以下のように、(1)と(2)のレコードが存在した場合、重複エラーとならなかったのですが、SQL Serverでは、当然ながら、重複エラーとなってしまいます。  (1)aaaaa, 1, あいうえお  (2)AAAAA, 1, かきくけこ  ※aaaaaとAAAAAが主キーの場合 CSVファイルのレコードは、多いもので700万件も含まれ、これを1行読み込み、既存データか否かをチェックし、既存の場合はINSERTしないという処理を700万回繰り返すと、相当な時間がかかり、性能向上を求められています。 そのため、BULK INSERTを使用する方向で検討してみました。 しかし、CSVファイルに主キー重複したレコードが存在すると、エラーが返されますが、BULK INSERTでは、どのレコードでエラーになったかまでは取得することができません。 ずいぶん、調べてみたのですが、無理のようでした。 BULK INSERTでエラーとなる箇所を特定する方法は本当にないでしょうか? もし、無理ならば、何か他にエラー箇所を特定して速くINSERTするコマンド、方法はないでしょうか? お知恵をお借りしたく、よろしくお願いいたします。