web-dev-qa-db-ja.com

SQL Server 2008でURLからファイルをダウンロードすることは可能ですか

ネットワーク上で一連のXMLベースのサービスを実行しています。

これらのサービスのデータは、SQL Server 2008インスタンスのテーブルにミラーリングする必要があります。

XMLをテーブルに取得することは問題ありませんが、私はすでにそれを行うことができますが、現時点でしなければならないのは、XMLの巨大な長い文字列をストアドプロシージャに渡して、OPENXMLコマンドを使用してテーブルに挿入することです。 。

私が知りたいのは、サードパーティのプログラムを使用してサービスからこのデータを取得してからストアドプロシージャを呼び出して挿入するのではなく、SQL Serverから直接XMLを取得することですサービスのURLと同じように処理します。

サーバーファイルシステムとの間でファイルを読み書きしたり、実際にXMLデータを挿入したりする数百万などについての記事や投稿がたくさんあるだけで、私が見つけられるように思えるのはすべてですが、サーバーにURLから直接データを取得させる方法については、こちらをご覧ください。

乾杯

----- ===== 2012年8月25日更新===== -----

もう少し調査した後、これを行う3つ目の方法を見つけました。

declare @xmlObject as int
declare @responseText as varchar(max)
declare @url as varchar(2048)

select @url = 'http://server/feed/data'

exec sp_OACreate 'MSXML2.XMLHTTP', @xmlObject OUT;
exec sp_OAMethod @xmlObject, 'open', NULL, 'get', @url, 'false'
exec sp_OAMethod @xmlObject, 'send'
exec sp_OAMethod @xmlObject, 'responsetext', @responseText OUTPUT
exec sp_OADestroy @xmlObject

select @responseText

exec sp_xml_preparedocument @idoc OUTPUT, @xmlData

これはうまくいくようで、かなり効率的に働きますが、ここで奇妙なことがあります。

「text/xml」というMIMEタイプの純粋なXMLデータを返す完全なURLを使用すると、応答テキストには何も含まれず、nullになりますが、「http:// server/feed /」または「 http:// server/'を使用して、Webサーバーが404ページまたはデフォルトのhtmlページを渡すだけで、実際のページコンテンツが取得されます。

最初はMIMEタイプかもしれないと思いましたが、 'text/xml'と 'text/html'の違いはありませんでしたが、有効なXMLを返すものはnullを与えるように見えますが、壊れたXMLを返すものは機能しているようです。

ただし、上記のコードはインターネットからの正しくフォーマットされたXMLで機能します。たとえば、「geonames」(上記のコードの元のソースが基づいていたもの)は正常に機能します。

フィードサーバーの構成と関係があるのではないかと思うので、これを解決するためにいくつかの作業を行う必要があるため、他のユーザーのためにここにコードを追加すると思いました。

@Remusは提案に感謝しますが、それは私が現在行っている方法です。私が書いたCLRバイナリがあり、フィードをDBに同期するために1日に1回実行されますが、データの同期に時間がかかりすぎます。ただし、XMLをフィードするためにそれを使用すると、純粋なループを実行するよりも高速ですが、XMLのサイズは非常に変動しやすく(バイナリがL2Sを使用してストアドプロシージャに渡す場合は特に)、入力がすでにオーバーフローしています。 SP数回データが多すぎたために数回、したがって、データ自体を取得するためにSPを取得しようとしているのはなぜですか。

@Mr Browstone-SSISは進むべき道のようです、それは他の提案があったことですが、私は(インポート/エクスポートウィザードを使用する以外にSSISを使用することについてひどいことを知らないことを認めます-私はもっとDBAよりも開発者の方が:-))だから、SSISを使用してこれをどのように達成するかについてのポインタは役に立ちます。

DBでCLRプロシージャを使用することについては、私はそれを試すことを考えていましたが、以前にこれらのものをひどくかじられて(そしていくつかのサーバーもクラッシュしました!!)、私はそれらを使用することに少し警戒しています。

3
shawty

HTTPの動作とデータベースへの挿入を行う外部プロセスを使用します。 SQLCLRを使用しないでください。貴重なSQL Serverをハイジャック workers HTTP結果を待つという退屈な仕事のために、ある日サーバーに深刻な影響を与えます。

しかし、XMLのサイズはかなり可変である可能性があり(バイナリがL2Sを使用してストアドプロシージャに渡すことを前提とすると、esp)、すでにSPへの入力が数回オーバーフローしています)データが多すぎるため

SQLサーバーからの画像のダウンロードとアップロードVIA ASP.NET MVC の手法を使用して、HTTP応答をデータベースにストリーミングします。

11
Remus Rusanu

私はsp_OACreateを広範囲に使用して、あなたがしているようなことをしています。受信しているXMLデータのサイズが8000文字を超えている可能性があります。 (つまり、8000文字を超えると、SQLがデータを返さない場合があります)。

sp_OAGetPropertyおよびその他の拡張ストアドプロシージャはvarchar(MAX)パラメータを渡すことができません

回避策として、結果をテーブルまたはテーブル変数に挿入できます。このようにして、sp_OACreateで任意のサイズのテキスト(htmlまたはxml)を正常に受信できます。

例:

INSERT INTO @tvResponse (Response)
EXEC @LastResultCode = sp_OAGetProperty @Obj, 'responseText' --, @Response OUT 
--Note:  sp_OAGetProperty (or any extended stored procedure parameter) does not support
--varchar(MAX), however returning as a resultset will return long results. 

また、HTMLを取得してSQLテーブルに解析するためのオープンソースのT-SQLコードをリリースしました。この一部は、sp_OAxxxプロシージャのニースラッパーを提供する#sputilGetHTTPプロシージャです。これは、エラー処理を実行し、さまざまなパラメータを簡単に指定できるようにします。SourceForgeから download を実行できます。このルーチンを使用してXML結果にアクセスしてみてください。XMLの受信に関する問題が解決される場合があります。

(#sputilGetHTTPおよびその他のプロシージャはすべて一時的なストアドプロシージャとして実装されていることに注意してください。データベースは変更されないため、このコードは本番環境で安全かつ簡単に使用できます。)

これとは別に、HTTPデータを取得できるCLRストアドプロシージャもあります。これが役に立てば喜んで共有しますが、これが必要になったのは、8000文字を超えるバイナリ(非テキスト)データを取得する必要があるときだけです。テキストを操作するときは、通常、上記のTSQLルーチンを使用します。

4
David Rueter

これを行うにはいくつかの方法があります。カスタムドライバーを使用して、リンクサーバーとしてWebサービスを設定できます。 CLRプロシージャを使用してWebサービスに接続できます。または、この組み込み機能を備えたSSISを使用できます。

作業を減らしたい場合は、SSISが適しています。ただし、いくつかの楽しみが必要で、SSISが提供できるよりも高い柔軟性が必要な場合は、CLRが適しています。

CLRを使用してこれを行う方法の詳細については、以下の質問への回答を参照してください。

https://stackoverflow.com/questions/8332298/connect-to-a-webservice-from-sql

これがお役に立てば幸いです。

3
Mr.Brownstone

あなたは開発者なので、SSISに問題はないはずです。

データフロータスクを作成し、スクリプトコンポーネントをソースとして使用します。スクリプトコンポーネントの優先言語(VB.netまたはC#)を選択します。おそらく、WebサイトからファイルをダウンロードするCLRコードのほとんどを再利用できます。次に、次のチュートリアルのレイアウトに従って、各ノードをバッファー内の位置に割り当てます。 http://beyondrelational.com/modules/2/blogs/106/posts/11130/ssis-read-xml-file -in-script-component-as-source.aspx

そこから、SQLまたはoledbの宛先と、挿入用のマッピング列を追加するだけです。

1
brian