- ベストアンサー
テキストデータをSQLServerに取込むには
列区切なし、改行コードなしの固定長データをSQLにコンバートしたいのですが、上手く行かず困っています。 (ファイル形式:テキストファイルバイナリ固定長) ・試した方法 (1)DTSインポート/エクスポート(←もう全然上手く行きませんでした・・・) (2)BULK INSERT (←上手く取り出せている自身がない・・・) またコンバート後、SUBSTRINGを使ってデータを取り出し、フィールドにセットしていこうと考えているのですが、これも上手く行きません。 半角・全角文字やスペースが含まれていると、取り出せないのでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
INSERT INTO ~ までで、一時テーブルにファイルの中身が全てそのまま入ります。 MS-DOSから【type [ファイルのフルパス]】と実行した時の結果です。 ところで根本的な疑問なのですが、 テキストファイルに(1)のようにデータが入っていて、 (2)のようにテーブルに入れたいということですよね? (1) 01AAA02BBB03CCC (2) -- --- 01 AAA 02 BBB 03 CCC それで構わないならば、No1の方の方法で上の例を使うとこのようになります。 CREATE TABLE #TempTable (value char(15)) INSERT INTO #TempTable EXEC master..xp_cmdshell 'type [ファイルのフルパス]' SELECT @value = value FROM #TempTable WHERE value IS NOT NULL SET @i = 1 WHILE @i <= DATALENGTH(@value) BEGIN INSERT INTO [テーブル名] VALUES (SUBSTRING(CAST(@value AS text),@i,2),SUBSTRING(CAST(@value AS text),@i,3)) SET @i = @i + 5 END もし例がおかしければ具体的な例を上げてください。
その他の回答 (2)
- oolong_tea
- ベストアンサー率50% (1/2)
No1の方の2行目のxp_cmdshellの後ろは【'type [ファイルのフルパス]'】だと思います。
- kumagoro-
- ベストアンサー率57% (36/63)
CREATE TABLE #TempTable (value char(8000)) INSERT INTO #TempTable EXEC master..xp_cmdshell '[ファイルのフルパス]' SELECT @value = value FROM #TempTable WHERE value IS NOT NULL ここまでで添付テーブルにファイルの内容が入り、 その内容が「@value」に入ります。 それが仮に100バイトだとして、これを10バイトずつテーブルに入れるとすると以下のようになります。 SUBSTRING関数は第一引数がchar型の時は文字数、text型の時はバイト数で数えるので、text型に変換しています。 SET @i = 1 WHILE @i <= 100 BEGIN INSERT INTO TableName VALUES (SUBSTRING(CAST(@value AS text),@i,10)) SET @i = @i + 10 END
補足
回答していただき、ありがとうございました。 でも、2行目の、INSERT INTO~のところで、エラーが発生してしまいます。 エラーの内容は、 「'[ファイルのフルパス]'は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチファイルとして認識されていません。」 と言うものです。 どういうことなのでしょうか???
補足
そのように変更したら、エラーは発生しなくなりました。 ありがとうございました。 ところで、基本的な質問なんですが、 CREATE TABLE #TempTable (value varchar(2738)) INSERT INTO ~ ここまでで、一体どのようなデータが出来上がるのでしょうか? テキストファイルの何バイトずつが1レコードになるのでしょうか? 全然理解してなくてすみません... よろしくお願いします。