SQL Server 2005 Standard, Windows XP(SP3)を使用しています。
あるツールから生成されるCSVファイルのデータベースへのインポートしたいと考えています。

しかし、CSVファイル以下のようなフォーマットになっています。
(・・・番号)は無視してください

date,2009/05/27 (・・・1)
name,test (・・・2)

時刻,A,B,C,D,E,F (・・・3)
11:13:05,1,2,3,4,5,6   (・・・4)
11:13:06,7,8,9,10,11,12  (・・・5)
(以下4,5のようなデータが続く…)


となっています。
1は日付情報、2は特に意味無し、3はカラムの情報としたい物
4(以降)はデータとなっています。


データベースへは "|" をカラムの区切りとすると

時刻 |A|B|C|D |E |F |
2009/05/27 11:13:05|1|2|3|4 |5 |6 |
2009/05/27 11:13:06|7|8|9|10|11|12|
(・・・以降データが続く)

上記のように(3)をカラム情報にして、不必要な情報を省いた状態でデータを取り込みたいと考えております。

同じく上記の最初のフィールドのように、元データのdate情報を時刻情報と合わせてdatetime型として一つので取り込みたいと考えています。

この為には、文字列の操作が必要となってくると思いますが、SQL Server上ではこのような事はできるのでしょうか?

このQ&Aに関連する最新のQ&A

A 回答 (4件)

そういえば、前にサーバはSQL Server 2000で、クライアントPC側にはSSMSだけインストールされていると書かれていませんでしたか?



・ファイルはクライアントPC側にあって、サーバにあるテーブルにデータを入れたい
 (処理の「実行」は、クライアントPC側で行う)
・ファイルはサーバ側にはコピーできない
・VBなどで多少の加工処理は書いてもよい(これもサーバでは実行できない)

上記のような理解ですが、それならばもっとも適した方法は、
1)VBなどで、ファイルを読み込んで1行目の日付を抜き出しつつデータ行の先頭に追加して別ファイルに書き出す処理だけを書く
2)BCPでファイルをサーバ側のテーブルにアップロードする
 (BCPユーティリティは本来コマンドラインから実行するものです)
です。

xp_cmdshellについては、exeも実行できますが、セキュリティ上の問題があるので、サーバで実行するのは嫌がられることがあります。
クライアントPCにもデータベースエンジンがインストールされているならば、実行させられるでしょうが、
結局サーバ側のテーブルに入れるにはBCPかOPENROWSETでリンクサーバ経由INSERTのいずれかが必要です。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
的確なアドバイスで本当に参考になります。

>そういえば、前にサーバはSQL Server 2000で、クライアントPC側にはSSMSだけインストールされていると書かれていませんでしたか?

その通りです。そこまで覚えていただいていて申し訳ありません。
(ツール面の機能統一をしたいので、2005に変更したいのですが当分先になりそうです。)

>・ファイルはクライアントPC側にあって、サーバにあるテーブルにデータを入れたい
 (処理の「実行」は、クライアントPC側で行う)
>・ファイルはサーバ側にはコピーできない
>・VBなどで多少の加工処理は書いてもよい(これもサーバでは実行できない)

これも把握されている通りです。
csvを生成するソフトを入れる許可が下りればサーバー側でファイルを持てるのですが…。

>それならばもっとも適した方法は、
>1)VBなどで、ファイルを読み込んで1行目の日付を抜き出しつつデータ行の先頭に追加して別ファイルに書き出す処理だけを書く
>2)BCPでファイルをサーバ側のテーブルにアップロードする

ご提案いただいた上記の方法でトライしてみようと思います。

ちなみに調べてみたのですがxp_cmdshellは2005からの機能みたいで、2000上では使えないようですね。

お礼日時:2009/05/29 09:06

補足です。



>ちなみに調べてみたのですがxp_cmdshellは2005からの機能みたいで、2000上では使えないようですね。

そんなことはありません。SQL Server 2000でも使えます。
http://msdn.microsoft.com/ja-jp/library/aa260689(SQL.80).aspx
むしろ、このストアドはテクノロジとしては古いです。
(xpはSQL Server 2000時代の拡張ストアドプロシージャのプレフィックスです。SQL Server 2005ではCLRが推奨されています)
    • good
    • 0

1) ストアドプロシージャを1本書く


 以下のいずれかの方法でワークテーブルに読み込む。
 ・BULK INSERT(カンマ区切り)
 ・OPENROWSET(BULK フォーマットファイル使用)
 ・xp_xmdshellによるBCP(カンマ区切り)
 1行目の日付を変数に取り込む。
 型変換して実テーブルにセットするときに時刻に日付をつないでINSERTする。

2) ストアドプロシージャを1本書く
 以下のいずれかの方法でワークテーブルに読み込む。
 ・BULK INSERT(デリミタなし)
 ・OPENROWSET(BULK)
 ・xp_xmdshellによるBCP(デリミタなし)
 1行目の日付を変数に取り込む。
 各行はコンマで切り出し、型変換して実テーブルにセットするときに時刻に日付をつないでINSERTする

3)SSISまたはDTSパッケージを作成する
 1からつくらなくても、データのインポートユーティリティからパッケージは生成できます。
 これにファイル先頭の日付を取り出す処理と、先頭列に日付を加える処理を追加します。

1)の方式は、先頭数行がデータ列ではなく、カンマの数が不足しているため、場合によってはうまく読み込めない
ケースがあります。
(行スキップオプションはありますが、カンマが不足していると行カウントが正しくされない)
2)の方式は、カンマで文字列を切り出す処理に少し工夫が必要です。
(CHARINDEXを使うか、XMLを使うか、スカラー関数を作るか)
3)は行スキップが正確に働くので、データ取り込み部分は設定がわかりやすいですが、追加する処理は多少勉強しないと設定できないでしょう。

なお、1)2)の方法はサーバ側に対象ファイルが存在する必要があります。
それぞれをとても説明しきれないので、キーワードでMSDNをあたってみてください。

この回答への補足

色々な方法を紹介していただいてありがとうございます。
1),2)はサーバーにデータがないとできないようですので、難しそうですが3)の方法を考えなくてはいけないかもしれません。

ただ、xp_cmdshellですがこれは外部で作成したexeを実行することが可能なようですが実際のところどうでしょうか?

このexeに文字列を整形する機能を持たせることもできるのかなと考えています。

補足日時:2009/05/29 00:01
    • good
    • 0

できるかできないかといえば、できます。



インポート先のテーブルが存在せず、CSVの内容に基づいて新規作成したいということであれば、SSIS(SQL Server Integration Service)を使って、パッケージを作成すれば可能です。

ストアドプロシージャを書く方法でもできなくはないですが、一旦ワークテーブルに取り込んで動的クエリでテーブルを作成する必要があるため、ちょっと厄介です。
(インポート先のテーブルが既に存在する前提ならば、もっと簡単です)

この回答への補足

ご回答ありがとうございます。
なるほどやはり何種類か実現手段があるのですね。

>(インポート先のテーブルが既に存在する前提ならば、もっと簡単です)

考えてみると確かにカラムの内容は固定になりますので、テーブルは存在していても問題ありませんね。
その場合どのような方法になるでしょうか?

補足日時:2009/05/27 23:11
    • good
    • 0

このQ&Aに関連する人気のQ&A

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

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

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

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

Qメールスプール一括削除をしてポート578で送信出来なくなりました。

メールスプール一括削除をしてポート578で送信出来なくなりました。

説明下手ですがよろしくお願いします。


最近Windows7に買い替えメールソフトがWindows Liveメールに変わりました。
アカウントの設定がサーバーにメールのコピーを置くという設定になっていて、サーバーがいっぱいになりぎみになり受信が出来ない状態になりました。

ので、その設定を外しましたがたまにエラーとなって返ってきたり(自分の携帯からPCにメールを送ると)していたのでプロバイダーのHPで色々調べメールスプール一括削除というのをしました。

自分では、サーバーにメールのコピーを置くという設定をしていたときのメールのコピーをすっきりさせたつもりでした。

しかしその後メールの送受信(WinLiveメールでは同期)をすると、受信は出来るのですが送信が不可に。

あれ?と思い メールスプール一括削除のことを忘れていてアカウントを削除し新規作成しましたがダメ。

システムの復元をし(このときもメールスプール一括削除を忘れてる)送受信してみるもダメ。

あ、とメールスプール一括削除を思い出しましたが直し方?がわからないので解決策を探し ネットで送信メールのポート番号がブロックされているかもとなっていたので 規定のポート25に変更しなんとか送信出来るようになったのですが・・・。

希望としてなぜそうなったのか?元のポート578では出来るように戻せないのかが知りたいです。

詳しい方教えてくれないでしょうか??

するんじゃなかったぁ~と後悔しまくりです・・・。

ちなみに
PCOS Windows7
メールソフト WindowsLiveメール
出たエラー  アカウント: '******', サーバー: '********', プロトコル: SMTP, ポート: 587, セキュリティ (SSL): なし, ソケット エラー: 10060, エラー番号: 0x800CCC0E
のようにでます。

プロバイダーはDIONでADSLです。

メールスプール一括削除をしてポート578で送信出来なくなりました。

説明下手ですがよろしくお願いします。


最近Windows7に買い替えメールソフトがWindows Liveメールに変わりました。
アカウントの設定がサーバーにメールのコピーを置くという設定になっていて、サーバーがいっぱいになりぎみになり受信が出来ない状態になりました。

ので、その設定を外しましたがたまにエラーとなって返ってきたり(自分の携帯からPCにメールを送ると)していたのでプロバイダーのHPで色々調べメールスプール一括削除と...続きを読む

Aベストアンサー

0x800CCC0Eへの対処法は決まっています。
http://121ware.com/qasearch/1007/app/servlet/qadoc?QID=011248
ですので、セキュリティ対策ソフトを終了させ、かつアカウント設定を削除して再作成しても駄目な場合は、Liveメール自体が壊れている可能性があるので、その場合はLiveメールを削除してしインストールするか、他のメールソフトをご利用下さい。

Qエラー:823 重大度:24 状態:6の障害について

SQLServerでシステムを運用しているのですが突如DBエラーが起こり止ってしまいます
ログを見るとエラー:823 重大度:24 状態:6~~のログがありました

調べてみますと
http://support.microsoft.com/kb/934713/ja
http://technet.microsoft.com/ja-jp/library/aa258735(SQL.80).aspx
このようなページがありました

読んでみますとハードエラーな可能性が高い気がしているのですが、
文章の中にDBCC CHECKDBを実行やサービスパックの更新等もあり、原因を絞り込めずにいます。

皆様のご意見を伺えたらと思っております。
どうぞよろしくお願い致します

Aベストアンサー

エラーメッセージをみるとハード障害によるデータファイルの
破損のような気がします。

http://technet.microsoft.com/ja-jp/library/aa258735(SQL.80).aspx

前後のログや、イベントビューアにハード関連のエラーは
出ていないでしょうか? 確認してください。

Qポートについて

ユーザが送信元ポートをA,宛先ポートをXで相手のサーバに通信して,
そのレスポンスが送信元ポートY,宛先ポートAであった場合問題なく
通信を確立できますか?
この通信のプロトコルにもよるのでしょうか?

また,ユーザが送信元ポートをA,宛先ポートをXで相手のサーバに通信して,
そのレスポンスが送信元ポートY,宛先ポートBであった場合はどうでしょうか?

Aベストアンサー

結論から言うと、そのようにアプリケーションを組めば出来るということに
なると思いますが・・開発はちょっと専門外です
ただ通常のWebサーバやwwwクライアントではそういう機能は無いと思いますよ

TCPIPのソケットプログラム作成のHPを探しましたが
本の紹介はあってもHPで分かりやすく・・というのは無さそうです
TCPIPのソケットプログラミングの本を図書館などで見ていただくのが
確実と思います・・中途半端な回答で申し訳ないです

Qテーブルのカラムの追加について

初歩的なことかもしれませんが、下記質問について教えてください。
現在SQL Server2000の環境でDBを使用しております。
現在使用しているDBの既存テーブルに簡単なバッチファイルを使ってカラムを追加後(ALTER TABLE)、その追加したカラムにデフォルト値やそのテーブルにレコードを追加しようとしています(個々までバッチ処理:
今回試したのは、クエリアナライザにて試験的に行っています)。
ただ、カラムの追加までは可能ですが、デフォルト値やレコードの追加を行うと「追加したカラムが無効です」というエラーが表示されます。
恐れいりますが解決策があれば、教えてください。

Aベストアンサー

まあ、一介のデザイナーでプログラマではありませんが・・・。
チクッと同じような作業をしてみました。

CREATE TABLE Test (id_name VARCHAR(32) NOT NULL,fainal_value INT Default 1)

これは、SQL SERVER 2000 に既定値を持つテーブルを作成するTransact-SQL文です。
周知のように、コマンドラインからバッチファイルとして実行することも可能です。
AccessからSQL文を発行して実行して見ると、確かに、既定値が定義されたテーブルが作成されました。
念のためにクエリアナライザでも実行しても同じ結果を得ました。
osql でも確認しました。
ということは、こんな感じでやればと思います。

さて、多分、ここまでは質問者も到達していることでしょう。
だとすれば、Default設定不可の列に設定しようとしているなどで失敗していると推察します。
Books Online の<DEFAULT 定義の作成と変更>を参照すれば、Defaultの設定には幾つかの条件があることが判ります。
そこら辺りを調べると解決すると思います。

まあ、一介のデザイナーでプログラマではありませんが・・・。
チクッと同じような作業をしてみました。

CREATE TABLE Test (id_name VARCHAR(32) NOT NULL,fainal_value INT Default 1)

これは、SQL SERVER 2000 に既定値を持つテーブルを作成するTransact-SQL文です。
周知のように、コマンドラインからバッチファイルとして実行することも可能です。
AccessからSQL文を発行して実行して見ると、確かに、既定値が定義されたテーブルが作成されました。
念のためにクエリアナライザでも実行しても同じ...続きを読む

QIP固定や、ポート開放をしたつもりだったのですが、

IP固定や、ポート開放をしたつもりだったのですが、
http://www.ugtop.com/spill.shtml
でポート番号を見たところ、設定したポート番号と違う上、ページ更新をするとポート番号が変わります。
これはポートがちゃんと開放されていないということなのでしょうか?

Aベストアンサー

>ポート番号を見たところ、設定したポート番号と違う上、ページ更新をするとポート番号が変わります。

そりゃ、クライアント(ブラウザ)がサーバに接続するポート番号は固定しないのが一般的だからです。
そのページでルータやファイヤーウォールなどのポート解放(ポートフォワーディングなど)の確認はできません。

TCPポートの指定した範囲への接続を試してくれるサイトが他にあるでしょう。
# そのポートで待ち受けしているアプリが起動していないと失敗と表示されるかも知れません。

Q日本語のテーブル名、カラム名の定義について

以前、IBMのオフコンでシステム開発を行っていた時期があります。 転職して今はネットワークエンジニアとしての仕事に就いておりますが、必要に迫られて、社内の部門システムの開発を始めようと考えております。

そこで、社内の販売管理の SQL Server のテーブル名、カラム名を確認してみると全て日本語で定義されております。 確固たる根拠はないのですが、どうしても違和感を覚えてしまいます。

今回の開発目的は、部門内のこまごました業務のシステム化で、顧客管理、グループ間の作業依頼や履歴管理等で、Visual Studio .NET 2003 + SQL Server 2000 を使って私一人で開発を行う予定です。 Windows フォーム、Web フォーム(ASP.NET)も利用予定です。

さて、前置きが長くなってしまいましたが、以前は、外資系の会社にいて日本語利用不可のシステム(データベース)でしたので、何も考える必要がなかったのですが、今回の開発を始めるに当たって SQL Server のテーブル名、カラム名の定義を日本語を行った場合の利点、欠点、考慮点等があれば教えて頂きたくて質問しました。

販売されている業務アプリやグループウェアの SQL Server のテーブルやカラム定義を見ても日本語は今まで見かけたことがないのですが、プロの開発者としてのご意見が伺えれば幸いです。

以前、IBMのオフコンでシステム開発を行っていた時期があります。 転職して今はネットワークエンジニアとしての仕事に就いておりますが、必要に迫られて、社内の部門システムの開発を始めようと考えております。

そこで、社内の販売管理の SQL Server のテーブル名、カラム名を確認してみると全て日本語で定義されております。 確固たる根拠はないのですが、どうしても違和感を覚えてしまいます。

今回の開発目的は、部門内のこまごました業務のシステム化で、顧客管理、グループ間の作業依頼や履歴管理等で...続きを読む

Aベストアンサー

日本語を使うメリット?
漢字を使えばビジュアル的に見て分かりやすい?という人もいます。漢字の方が短いTEXT長で多くのことを伝えられる。
他の人にメンテナンスを頼む場合、初めて見たテーブル構成でも理解しやすい。

私の意見としては
DB名・TABLE名・項目名にあまり漢字は使わないほうです。
個人のデータベースなら良いとしても企業内のシステムで使うようなものであればDBの設計資料などをきちんと作るのが当然で設計資料等にこの項目はこの内容ですとちゃんと書かれているし書かれているべきだから。
項目名等を漢字にするメリットってあまり無いと思います。
この項目は何?となったら設計資料見れば済みますから。
設計資料を見ることを許していないフロントエンドを使う一般のユーザーにはバックエンドのDBの構成等が分からなくても関係ないですし。
SQLで日本語使うのめんどくさいのもありますけどネ。

Qポートスキャンでこちらのポートではなく相手方のポートをコロコロ変えてア

ポートスキャンでこちらのポートではなく相手方のポートをコロコロ変えてアクセスしてくるのは何故ですか?

アクセスしてきて、そのポートに入れなかったから、こちらの別ポートを探そうとしてくるならわかりますが、既にフィルタリングでブロックされて入れなかったのに、相手方のポートをコロコロ変えて入れなかったポートにアクセスし続ける意味がわからないのですが・・。
相手方のポートを変えることに意味があるのですか?

Aベストアンサー

別に変えたくてコロコロ変えているわけではないと思います

http://www.way-on.com.tw/PCbasal/internet/tcpip5.htm
「クライアントのポート番号には、OSによって動的(ダイナミック)に任意の番号を割り当てて使用されています」
ソースポート(クライアントのポート番号)は動的に割り振られますので

自分のPCでも、Webブラウザを開いて何度かアクセスしながらDOSプロンプトでnetstatコマンドを叩けばソースポートが変化しているのがわかるでしょう

QSQL 特定のカラムが最大値のレコード取得

初心者です。SQL文で困っています。
どなたかご教授頂けたらと思います。

環境は、SQL SERVER 2000です。
特定のカラムが最大値のレコードのみ取得したいです。
たとえば、以下のようなデータがあるとします。
コード、履歴番号で主キーとします。
コード|履歴番号 |金額
0001 |1 |12000
0001 |2 |12001
0001 |3 |12002
0002 |1 |12000
0002 |2 |12001
0002 |3 |12002
0003 |1 |12000
0003 |2 |12001
この場合に、コード毎に履歴番号が最大のレコードのみを取得したいです。
理想の結果は以下になります。
コード|履歴番号 |金額
0001 |3 |12002
0002 |3 |12002
0003 |2 |12001

以上です。よろしくお願いいたします。

Aベストアンサー

SQL Server 2000で動くかどうか分かりませんが、SQL例です。

select *
from t1 as x
where 履歴番号=(select max(履歴番号)
from t1
where コード=x.コード)
order by コード

Qポート開放チェックとポートの状態

ポート開放チェックというサイトが多数あります。
グーグルで検索すれば何件かはヒットすると思います。

そういったサイトには必ず、ポートを使用するソフトウェアを起動します。
次にそのソフトウェアが使用するポート番号を入力します。
と書かれています。

ルーターのポートを開放し、ファイアウォールソフトのポートも開放し
ソフトを起動すればポートの開閉をチェックできるのは分かるのですが、
ルーターのポートは開放してあってもポートを使用するソフトウェアを
起動していないときのポートは開いているのでしょうか。
閉じているのでしょうか。

ふと気になったので質問させていただきました。
なお、ポートの開放の仕方を聞いているのではありません。

Aベストアンサー

未使用ポートなので状態はCLOSEDです。

Qストアド内でカラム名一覧を取得

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
ストアド内でカラム名一覧を取得、カンマで繋げてひとつの変数にまとめたい。
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

現在開発でストアドを使用する機会があり、そこで不明点が発生し悩んでおります。
以下、現状と質問です。

■SQL SERVER 2000


■テーブル(※)のカラム名一覧を取得し、
 カラム名をカンマで繋げてひとつの変数に格納したいと思っています。

 ※先の処理でカラムを取得したいテーブルをSELECTしており、
 対象のテーブル名を変数に代入しています。

 カラム一覧を取得するにあたり、以下のようにカーソルで習得し、
 FETCHでカラム名を変数に格納しようと考えていましたが、
 「'対象テーブル名'」には変数がいれられないので、どうしようかと悩んでいます。

 DECLARE CURS_test CURSOR FOR
  SELECT name FROM dbo.syscolumns
  WHERE id IN
  (SELECT id FROM dbo.sysobjects WHERE name = '対象テーブル名')
  ORDER BY id, colid;

 「sp_executesql」を使用してselect文を流そうとしたのですが、
 複数ある列名を取得して、上記で記載しましたように
 カラム名をカンマで繋げてひとつの変数に格納する方法がわかりませんでした。

 こういった場合、どのように考えて、どのように書けばよいのでしょうか。
 まだ触り始めたばかりで、わからないことがわかっていない部分もあり、
 質問内容でわかりにくい部分がありましたらご指摘いただければと思います。
 どうぞよろしくお願いいたします。

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
ストアド内でカラム名一覧を取得、カンマで繋げてひとつの変数にまとめたい。
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

現在開発でストアドを使用する機会があり、そこで不明点が発生し悩んでおります。
以下、現状と質問です。

■SQL SERVER 2000


■テーブル(※)のカラム名一覧を取得し、
 カラム名をカンマで繋げてひとつの変数に格納したいと思っています。

 ※先の処理でカラムを取得したいテーブル...続きを読む

Aベストアンサー

>「'対象テーブル名'」には変数がいれられないので、どうしようかと悩んでいます。
declare @tblname varchar(100)

set @tblname = '対象テーブル名'

DECLARE CURS_test CURSOR FOR
  SELECT name FROM dbo.syscolumns
  WHERE id IN
  (SELECT id FROM dbo.sysobjects WHERE name = @tblname)
  ORDER BY id, colid;

>カラム名をカンマで繋げてひとつの変数に格納する方法がわかりませんでした。

declare @colnm varchar(100)
declare @colnmconcat varchar(100)

set @colnmconcat = ''

fetch next CURS_test into @colnm
While @@fetch_status = 0
begin
if @colnmconcat = ''
begin
set @colnmconcat = @colnm
end
else
begin
set @colnmconcat = @colnmconcat + ',' + @colnm
end
fetch next CURS_test into @colnm
end

こういった感じでどうでしょう?(未検証ですが。)

>「'対象テーブル名'」には変数がいれられないので、どうしようかと悩んでいます。
declare @tblname varchar(100)

set @tblname = '対象テーブル名'

DECLARE CURS_test CURSOR FOR
  SELECT name FROM dbo.syscolumns
  WHERE id IN
  (SELECT id FROM dbo.sysobjects WHERE name = @tblname)
  ORDER BY id, colid;

>カラム名をカンマで繋げてひとつの変数に格納する方法がわかりませんでした。

declare @colnm varchar(100)
declare @colnmconcat varchar(100)

set @colnmconcat = ''

fetch next CUR...続きを読む


人気Q&Aランキング

おすすめ情報