![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?08b1c8b)
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_13.png?08b1c8b)
bcpコマンドでインサートをしたいと考えています。
テーブルの形式は
1 datetime 日時
2 filed_1 varchar(10)
3 filed_2 varchar(10)
4 filed_3 varchar(10)
です。
フォーマットファイルに
8.0
4
1SQLDATETIME08","1日時""
2SQLCHAR03","2filed_1""
3SQLCHAR03","3filed_2""
4SQLCHAR03"\r\n"4filed_3""
書きました。
データは、
2009/04/01 0:00:00,11.0,11.0,11.0
2009/04/01 0:01:00,11.0,11.0,11.0
です。
SQLServerは2005のExpressです。
実行すると
コピーを開始中です...
SQLState = 37000, NativeError = 7339
Error = [Microsoft][ODBC SQL Server Driver][SQL Server]リンク サーバー '(null)'
の OLE DB プロバイダ 'STREAM' から、列 '[!BulkInsert].日時' に無効なデータが返さ
れました。
BCP コピー in が失敗しました
が返されます。
成功させるにはどこを直せばよいでしょうか。
よろしくお願いします。
No.3ベストアンサー
- 回答日時:
うーん、複数の端末で試してみましたが、こちらではうまくいきます。
同様のケースでyyyy/MM/ddがうまくいかないという話はあるみたいですね。
ExpressもSP3にしてみるとか、2008Expressにしてみるとかという手もあるかもしれませんが、
実際ロケールに頼るのもどうかと思うので、別の方法も試してみてはどうでしょうか。
(ファイルは同じPC内でしたよね)
BCPの代わりにSQLCMDとOPENROWSETを使う方法です。
SQLCMD -Sサーバ -Uユーザ -Pパスワード -dデータベース -Q"INSERT INTO TEST SELECT * FROM OPENROWSET(BULK 'C:\Test.csv', FORMATFILE='C:\Test.fmt') x"
フォーマットファイルは同じのを使いますが、
8.0
4
1 SQLCHAR 0 20 "," 1 日時 ""
2 SQLCHAR 0 10 "," 2 field_1 ""
3 SQLCHAR 0 10 "," 3 field_2 ""
4 SQLCHAR 0 10 "\r\n" 4 field_3 ""
という風に長さを十分にします。
何が違うかというと、一旦ファイルをすべて文字列でテーブルのように読みだして、テーブルにはINSERTすることにより、
文字列から日付への変換をMDACではなく、SQL Serverに行わせるというものです。
yyyy/MM/dd hh:mm:ssは、SQL Serverではデフォルトで暗黙変換ができます。
この方法だと仮に変換がうまくいかなくても、
INSERT INTO TEST SELECT CONVERT(datetime,日時),field_1,field_2,field_3 FROM OPENROWSET(BULK 'C:\Temp\TestData.csv', FORMATFILE='C:\Temp\Test.fmt') x
という風に変換を明示的に指定してあげることもできるので、柔軟性があります。
(リモートサーバだとBCPのようにはいきませんが)
もちろん、yyyyMMddはうまくいくのだったら、最初にVBで日付形式を変換してからBCP実行するとか、そういう考え方もあるでしょう。
この回答への補足
ありがとうございます。
ExpressのSP3は見つかりませんでした。
2008はインストールするときに2005を削除しなくても良いのでしょうか?
SQLCMDとOPENROWSETを使う方法を試してみました。
テーブル名が「TEST」の場合はうまくいきますが
実際のテーブル名は「3ABC」のようなアルファベットと数字を組み合わせています。そうすると
メッセージ 102、レベル 15、状態 1、サーバー MATANO\SQLEXPRESS、行 1
'3' 付近に不適切な構文があります。
が表示されてしまいます。
混ぜることはできないようです。
あとちょっとなのに…
No.4
- 回答日時:
テーブル名は[3ABC]のようにカギカッコで括ってみてください。
No.2
- 回答日時:
>でも結果は同じでした。
同じ結果にはならないと思いますよ。少なくともメッセージは違うはずです。
ロケールというのは、それぞれのマシンが持っている日付や金額の基本書式のことです。
(コンパネで設定します)
日本語OSなら通常日付書式はyyyy/MM/ddになっているので、それを認識させて取りこむということです。
ちなみに、以下で試したら問題なく取りこまれましたよ。
<test.fmt>
8.0
4
1 SQLCHAR 0 8 "," 1 日時 ""
2 SQLCHAR 0 3 "," 2 field_1 ""
3 SQLCHAR 0 3 "," 3 field_2 ""
4 SQLCHAR 0 3 "\r\n" 4 field_3 ""
<test.csv>
2009/04/01 12:34:56,11.0,11.0,11.0
2009/04/01 11:23:45,11.0,11.0,11.0
bcp testdb.dbo.tbl1 in "C:\test.csv" -q -U"myuser" -P"mypass" -S"MYSERVER" -R -f"C:\test.fmt"
この回答への補足
テストまで調査して頂きありがとうございます。
でも、やっぱりできませんでした。
コピーを開始中です...
SQLState = 22008, NativeError = 0
Error = [Microsoft][ODBC SQL Server Driver]日付の形式が正しくありません。
SQLState = 22008, NativeError = 0
Error = [Microsoft][ODBC SQL Server Driver]日付の形式が正しくありません。
0 行コピーされました。
ネットワーク パケット サイズ (バイト数): 4096
クロック タイム (ミリ秒): 合計 1
いったい何が違うのか分かりません。
「20090401」ならうまくいくことがわかりました。
テーブルは下記スクリプトで作成しています。
USE [電気]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
/****** オブジェクト: Table [dbo].[TEST] スクリプト日付: 06/05/2009 15:41:37 ******/
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[TEST](
[日時] [datetime] NOT NULL,
[filed_1] [varchar](10) NULL,
[filed_2] [varchar](10) NULL,
[filed_3] [varchar](10) NULL,
CONSTRAINT [PK_TEST] PRIMARY KEY CLUSTERED (
[日時] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
コントロールパネルの時間形式は、短い形式に「2009/06/08」と書かれています。OSはXP ProのSP3です。SQLServer2005Expressです。
やっぱりどこか設定が間違っているのかもしれません。
No.1
- 回答日時:
SQLDATETIMEはネイティブ型のファイルにしか使えませんので、文字列型のファイルでは、日付でもSQLCHARを使います。
また、もともとyyyy/MM/dd形式のデータはデフォルトでは日付と認識してくれないので、今自分の使っているロケールで取り込むようにBCPに-Rオプションを追加してください。
この回答への補足
ありがとうございます。
やってみました。
bcpコマンドは
bcp "電気.dbo.データ" in "D:\test\bcptest\test.csv" -q -U"AAA" -P"BBB" -S"SQLEXPRESS" -R -f "D:\test\bcptest\test.fmt"
でも結果は同じでした。
「ロケールで取り込む」とはどういうことでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
今年はじめたいことは?
今年はこれをはじめたい!ということを教えてください!
-
【大喜利】【投稿~1/31】『寿司』がテーマの本のタイトル
【お題】 『寿司』がテーマの本のタイトルを考えてください
-
モテ期を経験した方いらっしゃいますか?
一生に一度はモテ期があるといいますが、みなさんどうですか? いまがそう! という方も、「思い返せばこの頃だったなぁ」という方も、よかったら教えて下さい。
-
あなたの人生で一番ピンチに陥った瞬間は?
これまでの人生で今振り返ると「あの時、1番ピンチだったなぁ...」という瞬間はありますか?
-
今から楽しみな予定はありますか?
いよいよ2025年が始まりました。皆さんには、今から楽しみにしている予定はありますか?
-
BCPでCSV内の文字列をテーブルのDatetime型カラムに取り込む方法
その他(データベース)
-
テキストデータをSQLServerに取込むには
その他(データベース)
-
bcp in でエラー
SQL Server
-
-
4
SQLSever 一括インポートについて
その他(パソコン・スマホ・電化製品)
-
5
datetime型のインポートについて
SQL Server
-
6
テーブル列数とデータファイル列数の違うbcpインサートをしたい
SQL Server
-
7
日付型のフィールドに空白を入れる方法を教えてください
その他(データベース)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・思い出すきっかけは 音楽?におい?景色?
- ・あなたなりのストレス発散方法を教えてください!
- ・もし10億円当たったら何に使いますか?
- ・何回やってもうまくいかないことは?
- ・今年はじめたいことは?
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・【大喜利】【投稿~1/31】『寿司』がテーマの本のタイトル
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・【大喜利】【投稿~1/20】 追い込まれた犯人が咄嗟に言った一言とは?
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・【大喜利】【投稿~1/9】 忍者がやってるYouTubeが炎上してしまった理由
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
accessのエクスポートエラーに...
-
SQL Server のデータをCSVファ...
-
ACCESSでのエクセルインポート...
-
エクスポート時の改行コードに...
-
MS-SQLプロシージャでファイル...
-
bcpによる、テーブル→CSVファイ...
-
bcpインサートでのフォーマ...
-
既に使用されているので、使用...
-
AccessでCSVインポートのゼロサ...
-
Access97の文字化けについて
-
SybaseのBCPでファイル上書き
-
symfowareのSQL文in句をバッチ...
-
アクセスのテーブルからエクス...
-
SQLServer2005 データのCSVファ...
-
Accessのリンクテーブルについて
-
「マスタ」と「テーブル」の違...
-
SELECT時の行ロックの必要性に...
-
インデックスの再構築の意味っ...
-
データの二重表示の原因
-
Access VBA [リモートサーバー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
accessのエクスポートエラーに...
-
エクスポート時の改行コードに...
-
SQL Server のデータをCSVファ...
-
既に使用されているので、使用...
-
SybaseのBCPでファイル上書き
-
SQLServer2005でフラットファイ...
-
ACCESSでのエクセルインポート...
-
AccessでCSVインポートのゼロサ...
-
symfowareのSQL文in句をバッチ...
-
MS-SQLプロシージャでファイル...
-
bcpによる、テーブル→CSVファイ...
-
Accessのリンクテーブルについて
-
アクセスのテーブルからエクス...
-
bcpインサートでのフォーマ...
-
DBMAGICのプログラム解析
-
SQLServer2005 クエリ結果のフ...
-
ACCESSでのCSVデータの自動取り...
-
[SQL Server] コマンドプロンプ...
-
スクリプトファイルの一括実行
-
SQLServer2005 データのCSVファ...
おすすめ情報