マンガでよめる痔のこと・薬のこと

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'
)

解決策を教えてください。

A 回答 (1件)

    • good
    • 0
この回答へのお礼

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

お礼日時:2013/10/09 16:36

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QCSVファイルをBULK INSERTでSQLserverに読み込むことは可能?

BULK INSERT というものを使って
SQLServer2000上のテーブルに読込みたいのですが可能でしょうか?

その場合どうやって記述すればよいのでしょうか?
終端文字とかいうのは何になるのでしょう?

Windows2000
RDOで接続です。

Aベストアンサー

””で区切られたファイルのインポートですが、BULK INSERTでは、”を含んでロードしてしまいます。ですので、BULK INSERT を使用する場合は”を削除してからロードしないと駄目です。

ところで、<www7.big.or.jp/~pinball/discus/sqls/index.html>でも質問をしているようですが、どのような環境で何がしたいのか状況がつかめません。

詳しく教えていただけませんか?

QBULKINSERTの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' 付近に不適切な構文があります。
となりました。
どのように記述したら構文エラーにならずに実行できるかご回答をよろしくお願いします。

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'
wi...続きを読む

Aベストアンサー

試してないけど
set @maxseq = @maxseq - 1;
bulk insert test_table
from 'C:\data\test.csv'
with
(firstrow = 1,lastrow = @maxseq,formatfile = 'C:\ImportOrg_Fmt.xml');
でうまくいくような気がする。

それでだめなら
declare cmdstr as varchar(2000);
set @maxseq = @maxseq - 1;
set cmdstr =
'bulk insert test_table
from ''C:\data\test.csv''
with
(firstrow = 1,lastrow = ' + @maxseq + ',formatfile = ''C:\ImportOrg_Fmt.xml'')';
exec (cmdstr);
といった感じで書く。
execは
http://msdn.microsoft.com/ja-jp/library/ms188332.aspx
参照。

QTransact-SQLのBULK INSERTでエラーをキャッチしたい

・環境
WindowsXP Pro
SQL Server2005

はじめまして。

Transact-SQLのBULK INSERTで、エラー(ファイルが存在しない等)が発生した場合に、専用の処理を行いたいと思っています。
※BULK INSERTでエラーが発生したら、リターンコード100を返す等の処理を行いたいと思ってます

私の方で試したのは、BULK INSERTをBEGIN TRYでネストしエラーキャッチを行おうと思いましたがキャッチできず困っております。

以下、質問させてください。
 ・BULK INSERTのエラーはエラーキャッチできないのか?できる場合その方法は?
 ・エラーキャッチできない場合、他の方法でBULK INSERTエラー時の処理を行う方法はあるのか?

お手数ですが、よろしくお願いします。

Aベストアンサー

ファイルの読み込み時エラーであれば捕捉できるはずですが、ファイル不存在などの場合は、リンクページの「ステートメントレベルの再コンパイルで発生するエラー (コンパイル後の名前の遅延解決により発生するオブジェクト名の解決エラーなど)」に相当するため、捕捉できないのだと思います。

したがって、以下のように動的クエリにすればよいです。
なぜこれだとOKなのかも、リンクページに書いてあります。

DECLARE @sql varchar(max)
BEGIN TRY
SET @sql='BULK INSERT TABLE1 FROM ''C:\AAAAA.txt'' WITH (ROWTERMINATOR=''\n'')'
EXEC (@sql)
END TRY
BEGIN CATCH
SELECT ERROR_NUMBER(),ERROR_MESSAGE()
END CATCH

参考URL:http://technet.microsoft.com/ja-jp/library/ms175976.aspx

QBULK INSERTについて

CSVをバルクインサートでitemテーブルにBULK INSERTする際に、
下記のようなSQL文を使っているのですが、CSV内のブランク文字は
実行後にNULLになってしまいます。
やりたいことはNULLではなく空白文字("")にしたいのですが、
下記のSQL文をどのように変えればよいのでしょうか。
または、CSVを変更する方法でもよいです。

BULK INSERT item
FROM 'c:\test.txt'
WITH
(
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n'
);

大変お手数ですが、
わかる方がいらっしゃいましたらよろしくお願いいたします。

Aベストアンサー

http://msdn.microsoft.com/ja-jp/library/ms187887.aspx

あらかじめ、インサートする対象のフィールドにデフォルト値で空文字列を設定します。この状態でBULK INSERTを実行すれば空文字列が設定されます。

QBULK INSERTで失敗

いつも拝見させて頂いております。

今回はSQLServerのBULK INSERTについて質問させていただきます。
現在、UNIXから出力されたデータファイルをWindows2000Serverにて
ストアドからBULK INSERTを使用して取り込もうとしています。
ですが、うまく取り込めず困っています。
現在は『BULK INSERT TBL名 FROM 'サーバ内のファイル'』として
クエリアナライザからも実行しているのですが、最後のカラムで
桁あふれとなりエラーが発生してしまいます。
行終端文字が認識できず、全てのデータが1行とみなされているようです。
しばらく、調べているのですが調べれば調べるほど正常に取り込めなければ
おかしいと思ってしまっています。

以下が現在の状況です。
1.BULK INSERTの行終端文字のデフォルトは\n(LF)であり、
  取り込もうとしているデータファイルの行終端文字も\n(LF)である。

この状況であれば取り込めるかカラムのデータ型不一致等のエラーまで進むと思っているのですが、そこまで進みません。どなたかこのような状況を経験したら方が
いらっしゃいましたらご教授いただきたく存じます。

宜しくお願い致します。

いつも拝見させて頂いております。

今回はSQLServerのBULK INSERTについて質問させていただきます。
現在、UNIXから出力されたデータファイルをWindows2000Serverにて
ストアドからBULK INSERTを使用して取り込もうとしています。
ですが、うまく取り込めず困っています。
現在は『BULK INSERT TBL名 FROM 'サーバ内のファイル'』として
クエリアナライザからも実行しているのですが、最後のカラムで
桁あふれとなりエラーが発生してしまいます。
行終端文字が認識できず、全てのデータが1行とみなされ...続きを読む

Aベストアンサー

まず最初に調べるとすれば

1. バイナリエディタ(http://www.zob.ne.jp/~c.mos/soft/bz.html 等)を使って、行終端文字が本当に\nになっているかどうかを確認する。特に、bulk insertを実行しているサーバ上で、ファイルの内容を確認すること。

2. すべてのデータを1行とみなしているのだとすれば、データファイルが1行であればエラーなくbulk insertが可能なはずなので、データファイルが1行の場合と2行ないしそれ以上の場合でテスト実行を行う。

あたりでしょうか。

QSQLSever 一括インポートについて

SQLserver で大量にあるCSVファイルをインポートしたいのですが
コードが分かりません。
各Csvファイルには1行目に列名が書かれており、全て同じ構成となっております。
MSDNで調べて下記コードを見つけたのですがうまく起動しません。
「列名 'IntCol' が無効です。」と出てしまいます。

------------------------------------------------------------
-- Query before update shows initial state of XmlCol values.
SELECT * FROM T
UPDATE T
SET XmlCol =(
SELECT * FROM OPENROWSET(
BULK 'C:\SampleFolder\SampleData3.txt',
SINGLE_BLOB
) AS x
)
WHERE IntCol = 1
GO
------------------------------------------------------------
単純に
「同じ構成の複数あるcsvファイルを1つのテーブルにインポートする」
というコードなのですが、どうやればよいのでしょうか?

SQLserver で大量にあるCSVファイルをインポートしたいのですが
コードが分かりません。
各Csvファイルには1行目に列名が書かれており、全て同じ構成となっております。
MSDNで調べて下記コードを見つけたのですがうまく起動しません。
「列名 'IntCol' が無効です。」と出てしまいます。

------------------------------------------------------------
-- Query before update shows initial state of XmlCol values.
SELECT * FROM T
UPDATE T
SET XmlCol =(
SELECT * FROM OPENROWSET(
BULK '...続きを読む

Aベストアンサー

>フィールド ターミネータ
エラーメッセージからして列区切りが認識されてないように思います。
区切りはTABコードでしょうか?
他の場合は、指定しないといけなかったように思います。

Q処理件数を非表示にしたい

ManagementStudioでストアドプロシージャの開発をしています

開発中、デバッグのためにプロシージャをコールすると、SQLの発行の度に
「何件処理されました。」
「何件処理されました。」
「何件処理されました。」
「何件処理されました。」
「何件処理されました。」
・・・

と処理件数が表示され、確認の際に邪魔で困っています。
処理件数を非表示にするにはどうすれば良いでしょうか?

また同様に、SELECT文の発行ごとにSELECT結果がグリッドに表示されるのを非表示にできないでしょうか?

Aベストアンサー

処理件数を非表示にする方法

⇒SELECT文の前に「set nocount on」を記載すると件数は表示されません。

SELECT文の発行ごとにSELECT結果がグリッドに表示されるのを非表示にする方法

⇒デバッグのためには表示された方が良いと思いますが、
 とりあえず…SELECT文の前に「SET NOEXEC ON」を記載するとデバッグだけ実施され、
 グリッドは表示されません。
例であげると以下のとおりです。
SET NOCOUNT ON
SET NOEXEC NO
SELECT *
FROM DB.dbo.TableName
go

QCSV形式のファイルを読み込んでテーブルに格納するには?(BULK INSERT、BCP、DTS)

VisualBasicのカテゴリでも質問したのですが、
こちらの方が回答がつく可能性が高いのではと思い、こちらにも書き込みました。

今、
"aaa","bbb","ccc" 
のような形で1レコードのCSVファイルがあります。
これをSQLServer2000上のテーブルに読込みたいのですが、
10件ほどの少ないレコードなら
各フィールドごとを変数に入れて読込み、
それをループさせてINSERT INTO すればよいのですが・・・。

大量の件数の場合時間がかかりすぎてしまいます。
それで、BULK INSERT、BCP、DTS などの利用を考えているのですが、

まず、何よりこの質問です。

(1)このようなファイル形式のものを上記の方法で読込めるのか?

実現可能なのかをまずお聞きしたいです。
どなたか、成功されている方はいらっしゃいますか?

(2)BCPでファイルのフォーマットを指定したファイルを用意して試みたところ、
""で区切られているため、その部分もフィールドに取り込まれてしまい、
binaryデータが切り詰められましたとなってしまいます。
この回避方法はないでしょうか?

(3)""が余計なので、これを変換して読込むことは可能ですか?
DTSはVisualBasic上からコマンドとして利用したいです。
batファイルを用意してもいいです。

困っています。どなたか助けてください。

VisualBasicのカテゴリでも質問したのですが、
こちらの方が回答がつく可能性が高いのではと思い、こちらにも書き込みました。

今、
"aaa","bbb","ccc" 
のような形で1レコードのCSVファイルがあります。
これをSQLServer2000上のテーブルに読込みたいのですが、
10件ほどの少ないレコードなら
各フィールドごとを変数に入れて読込み、
それをループさせてINSERT INTO すればよいのですが・・・。

大量の件数の場合時間がかかりすぎてしまいます。
それで、BULK INSERT、BCP、DTS などの利用を...続きを読む

Aベストアンサー

DTSインポートエクスポートウィザードを使用すれば、”を含むCSVファイルでもよ見込むことが出来ますよ。
[スタート]-[プログラム]-[Microsoft SQL Server]-[データのインポートとエクスポート]から呼び出すことも出来ます。

変換元(データのコピー元)にCSVファイル(データソース:Text File)を選択して、変換先に接続するSQLServerとデータベース名を指定して・・・
順次設定していけば、設定できますよ。
#最後にちゃんと保存してくださいね。

話は変わりますが、最初の質問から派生して関連する質問をするのであれば、ちゃんと最初の質問を終了してから新規の質問を作成してください。感じ悪いです。回答している人の気持ちを考えてください。

Qテーブル列数とデータファイル列数の違うbcpインサートをしたい

DBのテーブルの列数は258です。
インサートするデータファイルの列数は65です。
データファイルは","で区切られたファイルです。
SQL Serverは2005です。

コマンドを下記のように書きました。
SQLCMD -S"\SQLEXPRESS" -U"user" -P"pass" -d"計測" -Q"INSERT INTO [計測データ] SELECT 4,CONVERT(datetime,年月),データ1,データ2,データ3,データ4,データ5,・・・データ256 FROM OPENROWSET(BULK 'D:\200906.csv', FORMATFILE='D:\test.fmt',FIRSTROW = 2) x"

フォーマットファイルは、
8.0
68
1SQLCHAR01""0 Firsrt_QUOTE ""
2SQLCHAR020"\","1年月 ""
3SQLCHAR010","2データ1 ""
4SQLCHAR010","3データ2 ""
5SQLCHAR010","4データ3 ""
・・・
66SQLCHAR010"\r\n"65データ64 ""

しかしエラーになってしまいます。
そもそも列数が違うと無理なのでしょうか。

DBのテーブルの列数は258です。
インサートするデータファイルの列数は65です。
データファイルは","で区切られたファイルです。
SQL Serverは2005です。

コマンドを下記のように書きました。
SQLCMD -S"\SQLEXPRESS" -U"user" -P"pass" -d"計測" -Q"INSERT INTO [計測データ] SELECT 4,CONVERT(datetime,年月),データ1,データ2,データ3,データ4,データ5,・・・データ256 FROM OPENROWSET(BULK 'D:\200906.csv', FORMATFILE='D:\test.fmt',FIRSTROW = 2) x"

フォーマットファイルは、
8.0
68
1SQ...続きを読む

Aベストアンサー

bcpとsqlcmdによるOPENROWSETの実行は別物です。
同じようなことはできますが、まずは区別して認識しましょう。

OPENROWSETは、ファイルをテーブルに見立ててSELECTする方法です。
だから書いているクエリも"INSERT INTO ~ SELECT ~"です。
列数の少ないテーブルAから列数の多いテーブルBにINSERTするとき、どうしていますか?

INSERT INTO テーブルA
(列1,列2,列3,...,列10)
SELECT 列1,列2,列3,....,列10 FROM テーブルB

って書きますよね?
やっているのは全く同じことです。

Q文字列をsplitするSQL文を教えて下さい

SQLServer2000上で指定した文字で文字列をsplitような関数があれば教えて頂けますか?

例えば"12345.6789"という文字列を"."(ピリオド)を指定して、"12345"と"6789"という2つの文字列を取得したいと思っています。

Transact-SQLの関数リファレンスを見てみたのですが、適当なものが見つかりませんでした。
自作するしかないのでしょうか・・

Aベストアンサー

見当たりませんね~。

declare @str1 nvarchar(1),@str2 nvarchar(50)
select @str1 =N'.',@str2 = N'12345.6789'
select
substring(@str2,1,charindex(@str1,@str2)-1) as 前,
substring(@str2,charindex(@str1,@str2)+1,len(@str2)-charindex(@str1,@str2)) as 後

こんな感じにしかできないみたいです


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング