- PR -

ストアドプロシージャでの環境変数の取得について

投稿者投稿内容
HIRO
常連さん
会議室デビュー日: 2004/10/28
投稿数: 41
投稿日時: 2005-06-02 15:23
SQLServer2000のストアドプロシージャにてOSの環境変数(TEMP)を取得
したいのですが、取得の方法がわかりません。

分かられる方、宜しくお願いします。
今川 美保(夏椰)
ぬし
会議室デビュー日: 2004/06/10
投稿数: 363
お住まい・勤務地: 神奈川県茅ヶ崎市
投稿日時: 2005-06-02 16:59
sp_configureって使えますかねぇ?

http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/tsqlref/ts_sp_ca-cz_0put.asp
TLC
大ベテラン
会議室デビュー日: 2005/05/31
投稿数: 152
お住まい・勤務地: 東京都
投稿日時: 2005-06-02 17:02
ストアドプロシージャからサーバーOSのテンポラリフォルダを取得する要件とはどのようなものでしょうか?

例えば,フラットファイルのデータインポート/エクスポートなどの用件でしたら,
bcp ユーティリティを経由して,

 bcp dbname.dbo.table out/in %temp%test.txt 〜

のように,コマンドライン上で環境変数を使用することができます。
これを xp_cmdshell でキックするストアドプロシージャを作成する。というようなことはできます。(セキュリティ上の問題がありますが)

また,DTS (Data Transformation Services)であれば,
ActiveX スクリプトや動的プロパティテスク を利用することによって,環境変数に直接アクセスすることも可能です。

T-SQL のみを利用したストアドプロシージャですと,非常に厳しいと思います。
要件によって,ストアド以外の方法を検討されてはいかがでしょうか?
TLC
大ベテラン
会議室デビュー日: 2005/05/31
投稿数: 152
お住まい・勤務地: 東京都
投稿日時: 2005-06-02 18:44
引用:

夏椰(かや)さんの書き込み (2005-06-02 16:59) より:
sp_configureって使えますかねぇ?




sp_configure は SQL Server の設定変数を取得/設定 するためのものですから,
OSの環境変数はとれませんねぇ。
コネクションの最大数やスレッド最大数などを設定することができます。
HIRO
常連さん
会議室デビュー日: 2004/10/28
投稿数: 41
投稿日時: 2005-06-02 18:57
夏椰さん、TLCさん返信ありがとうございます。

処理内容としては、bcpを使用して出力したテキストファイルをBLUK INSERTで一括書き込みを
行う処理でbcpでの出力先にTEMPフォルダを使用しBLUK INSERTのファイルパスにも使用
したいと考えています。

とりあえず、xp_cmdshellを使っての取得を考えていますが、outputの情報を変数に取得する
にはどうすればいいのでしょうか?

ちなみに以下のようにやってみたのですが、成功と失敗の戻り値しか取得できないみたいですね

EXEC @TEMP = master..xp_cmdshell 'echo %TEMP%

宜しくお願いします。
TLC
大ベテラン
会議室デビュー日: 2005/05/31
投稿数: 152
お住まい・勤務地: 東京都
投稿日時: 2005-06-02 19:14
引用:

HIROさんの書き込み (2005-06-02 18:57) より:

処理内容としては、bcpを使用して出力したテキストファイルをBLUK INSERTで一括書き込みを
行う処理でbcpでの出力先にTEMPフォルダを使用しBLUK INSERTのファイルパスにも使用
したいと考えています。




まず,
xp_cmdshell は,シェルを呼び出しているだけですので,これはプロセスの実行ステータスの数値情報しか返しません。

そして,
HIRO さんの要件ですが,
1.一括出力
2.一括入力
をOSのテンポラリパス経由で行えればよいということですので,

入力も出力も bcp で行えばよいと思います。
ストアドプロシージャ内に TEMP の値をストアする必要がありません。

master..xp_cmdshell 'bcp tableA out %temp%\filename.txt 〜'

master..xp_cmdshell 'bcp tableB in %temp%\filename.txt 〜'

と順番に実行すれば実装できます。
Bulk Insert の T-SQL 文で列のマッピングなどをしている場合は,フォーマットファイルを用意して対応してください。
HIRO
常連さん
会議室デビュー日: 2004/10/28
投稿数: 41
投稿日時: 2005-06-02 19:33
引用:
入力も出力も bcp で行えばよいと思います。
ストアドプロシージャ内に TEMP の値をストアする必要がありません。



確かにその通りですね。環境変数をストアしない方法で考えて見ます。

ありがとうございました。
カーニー
ぬし
会議室デビュー日: 2003/09/04
投稿数: 358
お住まい・勤務地: 東京
投稿日時: 2005-06-03 01:56
引用:

TLCさんの書き込み (2005-06-02 19:14) より:
まず,
xp_cmdshell は,シェルを呼び出しているだけですので,これはプロセスの実行ステータスの数値情報しか返しません。



xp_cmdshellって、コマンドの実行結果を結果セットとして取得可能なはず。
出力1行を1列1レコードとして。

先日 dirコマンドの実行結果を取得するスクリプト書いたばっかなので、原理的には同じですよね?

スキルアップ/キャリアアップ(JOB@IT)