TSQL コードから Web サービスを呼び出すことはできますか?
-
09-06-2019 - |
質問
TSQL ストアド プロシージャまたは関数から Web サービスを呼び出す方法はありますか?
解決
はい、このように作成できます
CREATE PROCEDURE CALLWEBSERVICE(@Para1 ,@Para2)
AS
BEGIN
Declare @Object as Int;
Declare @ResponseText as Varchar(8000);
Exec sp_OACreate 'MSXML2.XMLHTTP', @Object OUT;
Exec sp_OAMethod @Object, 'open', NULL, 'get', 'http://www.webservicex.com/stockquote.asmx/GetQuote?symbol=MSFT','false'
Exec sp_OAMethod @Object, 'send'
Exec sp_OAMethod @Object, 'responseText', @ResponseText OUTPUT
Select @ResponseText
Exec sp_OADestroy @Object
END
他のヒント
必ず できる, 、しかし、これはひどい考えです。
Web サービスの呼び出しには任意の時間がかかり、その時点でネットワーク上でプレイされているカウンターストライク ゲームの数に応じてランダムに失敗する可能性があるため、どれくらい時間がかかるかわかりません。
XML を構築して HTTP リクエストをリモート サーバーに送信し、その後 XML を解析して応答を送り返すまでに、少なくとも 0.5 秒かかると考えられます。
どのアプリケーションが実行したとしても、
INSERT INTO BLAH
Web サービスを起動したクエリは、完了するまで待つ必要があります。これが毎日のスケジュールされたタスクのようにバックグラウンドでのみ発生するものでない限り、アプリのパフォーマンスは爆撃されるでしょう。Web サービスを呼び出すコードは SQL サーバー内で実行され、そのリソースを使い果たします。HTTP リクエストの待機に長い時間がかかるため、大量のリソースを消費することになり、サーバーのパフォーマンスが再び低下します。
T-SQL コード自体ではありませんが、SQL Server 2005 以降では、基本的に .NET コード内の関数である CLR ストアド プロシージャを記述し、それらをストアド プロシージャとして公開して利用できるようになりました。.NET Framework のほとんどをすぐに利用できるので、これを通じて Web サービスを利用できることがわかります。
ここで詳しく説明すると少し長くなりますが、リンクを貼っておきます。 MSDN の記事 話題になっている。
トラフィックが多い場合やミッションクリティカルな場合にはこれを行いませんが、サービスからフィードバックを受け取る必要がない場合は、実際に行うのは素晴らしいことです。
以下は私がやったことの一例です。
- テーブルに対する挿入と更新のトリガー
- Stored Proc と呼ばれるトリガーは、トランザクションの JSON データを Web API エンドポイントに渡し、AWS の MongoDB に挿入します。
古い XML は使用しないでください
JSON
EXEC sp_OACreate 'WinHttp.WinHttpRequest.5.1', @Object OUT;
EXEC sp_OAMethod @Object, 'Open', NULL, 'POST', 'http://server/api/method', 'false'
EXEC sp_OAMethod @Object, 'setRequestHeader', null, 'Content-Type', 'application/json'
DECLARE @len INT = len(@requestBody)
完全な例:
Alter Procedure yoursprocname
@WavName varchar(50),
@Dnis char(4)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @Object INT;
DECLARE @Status INT;
DECLARE @requestBody NVARCHAR(MAX) = '{
"WavName": "{WavName}",
"Dnis": "{Dnis}"
}'
SET @requestBody = REPLACE(@requestBody, '{WavName}', @WavName)
SET @requestBody = REPLACE(@requestBody, '{Dnis}', @Dnis)
EXEC sp_OACreate 'WinHttp.WinHttpRequest.5.1', @Object OUT;
EXEC sp_OAMethod @Object, 'Open', NULL, 'POST', 'http://server/api/method', 'false'
EXEC sp_OAMethod @Object, 'setRequestHeader', null, 'Content-Type', 'application/json'
DECLARE @len INT = len(@requestBody)
EXEC sp_OAMethod @Object, 'setRequestHeader', null, 'Content-Length', @len
EXEC sp_OAMethod @Object, 'send', null, @requestBody
EXEC sp_OAGetProperty @Object, 'Status', @Status OUT
EXEC sp_OADestroy @Object
以前のバージョンの SQL では、拡張ストアド プロシージャまたは xp_cmdshell を使用して Web サービスをシェルアウトして呼び出すことができました。
これらはどちらもまともなアーキテクチャのように聞こえるわけではありませんが、時にはクレイジーなことをしなければならないこともあります。
埋め込み VB オブジェクトを使用してそれを行うことができます。
まず、'MSXML2.XMLHttp' 型の VB オブジェクトを 1 つ作成し、この 1 つのオブジェクトをすべてのクエリに使用します (毎回再作成すると、パフォーマンスが大幅に低下することが予想されます)。
次に、そのオブジェクトといくつかのパラメーターをストアド プロシージャに入力し、そのオブジェクトに対して sp_OAMethod を呼び出します。
不正確な例で申し訳ありませんが、Google で簡単に検索すると、vb-script メソッドがどのように実行されるかがわかるはずです。
--
しかし、CLR バージョンははるかに...はるかに簡単です。Web サービスを呼び出す場合の問題は、Web サービスが DB エンジンの速度に追いつかないことです。処理が追いつかない場合、多くのエラーが発生します。
また、Web サービスには毎回新しい接続が必要であることを覚えておいてください。多重性が作用します。テーブルの関数呼び出しを処理するために 5000 のソケット接続を開く必要はありません。それは愚かだ!
その場合、カスタム集計関数を作成し、それを引数として使用して Web サービスに渡し、結果セットを返す必要があります。その後、それを照合する必要があります。データを取得するのは本当に厄介な方法です。
SQL 2000 互換性レベルを使用していて、clr 統合を実行できない場合は、次を参照してください。 http://www.vishalseth.com/post/2009/12/22/Call-a-webservice-from-TSQL-(Stored-Procedure)-using-MSXML.aspx
私は世界中の大企業/グローバル企業で Oracle データベースを使用して働いています。私たちはストア プロシージャを使用して常に DB 経由で Web サービスを利用していますが、トラフィックが多いものであっても問題はありません。それらはすべて内部使用のため、つまりインターネットへのアクセスはなく、工場内のみで使用されます。使用することをお勧めしますが、どのようにデザインするかには十分に注意してください