سؤال

هل هناك طريقة للاتصال من tsql ضمن إجراء مخزن أو دالة إلى خدمة ويب?

هل كانت مفيدة؟

المحلول

نعم ، يمكنك إنشاء مثل هذا

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 و إرسال استجابة إلى الوراء.

  1. أيهما التطبيق لم INSERT INTO BLAH الاستعلام الذي تسبب في خدمة الإنترنت إلى النار سوف تضطر إلى الانتظار حتى الانتهاء.إلا إذا كان هذا أمر لا يحدث إلا في الخلفية مثل اليومية المهمة المجدولة ، التطبيق الخاص بك أداء الذهاب إلى قنبلة

  2. خدمة ويب-الاحتجاج تشغيل التعليمات البرمجية داخل SQL server ويستخدم إنه الموارد.كما انها سوف تأخذ وقت طويل من الانتظار HTTP الطلب عليك في نهاية المطاف استخدام الكثير من الموارد التي سوف مرة أخرى يصب أداء الخادم الخاص بك.

لا في T-SQL البرمجية نفسها ، ولكن مع SQL Server 2005 وما فوق ، لقد مكنت القدرة على الكتابة CLR الإجراءات المخزنة التي هي أساسا وظائف في .رمز الشبكة ثم كشف لهم الإجراءات المخزنة للاستهلاك.لديك أكثر من .NET framework في متناول يدك على هذا حتى أستطيع أن أرى استهلاك خدمة ويب ممكن من خلال هذا.

فمن قليلا مطولة لمناقشة بالتفصيل هنا ولكن هنا رابط المقالة MSDN عن هذا الموضوع.

أنا لا أفعل هذا من أجل حركة المرور الكثيفة أو مهمة الأشياء ، ومع ذلك ، إذا كنت لا تحتاج إلى تلقي ردود الفعل من الخدمة ، ثم هو في الواقع شيء عظيم أن تفعل.

هنا هو مثال على ما فعلت.

  1. مشغلات إدراج تحديث على الجدول
  2. الزناد يسمى المخزنة Proc التي يمر البيانات JSON الصفقة إلى ويب Api نقطة النهاية ثم تدرج في MongoDB في AWS.

لا تفعل القديمة XML

سلمان

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, هل يمكن استخدام إما المخزنة الموسعة proc أو xp_cmdshell إلى قذيفة من أصل و استدعاء خدمة ويب.

ليس أي من هذه تبدو لائقة العمارة - ولكن في بعض الأحيان عليك أن تفعل أشياء مجنونة.

يمكنك أن تفعل ذلك مع جزءا لا يتجزأ من VB الكائنات.

أولا يمكنك إنشاء واحدة VB كائن من النوع 'MSXML2.XMLHttp', و يمكنك استخدام هذا الكائن على جميع الاستفسارات الخاصة بك (إذا كنت إعادة كل مرة نتوقع الثقيلة الأداء جزاء).

ثم تغذية هذا الكائن بعض المعلمات في إجراء مخزن استدعاء sp_OAMethod على الكائن.

آسف على inprecise سبيل المثال ، ولكن جوجل للبحث سريع تكشف كيفية vb-سكربت طريقة عمله.

--

ولكن CLR نسخة بكثير....أسهل بكثير.المشكلة مع الاحتجاج webservices هو أنهم لا يستطيعون مواكبة DB المحرك.سوف تحصل على الكثير من الأخطاء حيث أنها فقط لا يمكن مواكبة.

وتذكر خدمات ويب تتطلب اتصال جديد في كل مرة.تعدد يأتي دور.كنت لا تريد أن تفتح 5000 اتصالات مأخذ التوصيل إلى خدمة استدعاء دالة على الطاولة.هذا لوني!

في هذه الحالة سيكون لديك لإنشاء مخصص الكلي وظيفة و استخدام ذلك كحجة لتمرير إلى خدمة ويب الخاص بك ، والذي من شأنه أن بإرجاع مجموعة نتائج... ثم عليك أن جمع ذلك.حقا محرجا طريقة للحصول على البيانات.

إذا كنت تعمل مع sql 2000 مستويات التوافق وما لا يمكن القيام به clr التكامل ، انظر http://www.vishalseth.com/post/2009/12/22/Call-a-webservice-from-TSQL-(Stored-Procedure)-using-MSXML.aspx

وأنا اعمل الكبير/الشركات العالمية في جميع أنحاء العالم ، وذلك باستخدام قواعد بيانات أوراكل.نحن تستهلك خدمات الويب في كل مرة من خلال DB مع الإجراءات مخزن و لا حتى تلك التي مع حركة المرور الكثيفة.كل منهم للاستخدام الداخلي ، أعني من دون الوصول إلى الإنترنت فقط داخل النبات.أنصح استخدامه لكن أن تكون حذرا جدا حول كيفية تصميم

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top