webservice stored sp_oacreate services invocar desde consumir sql-server web-services tsql

sql server - stored - ¿Puedes llamar a un servicio web desde el código TSQL?



sp_oacreate (8)

¿Hay alguna manera de llamar desde un procedimiento o función almacenada TSQL a un servicio web?


Claro que puedes , pero esta es una idea terrible.

Como las llamadas al servicio web pueden tomar cantidades de tiempo arbitrarias, y fallan aleatoriamente, dependiendo de la cantidad de juegos de contraataque que se estén jugando en su red en ese momento, no se puede saber cuánto tiempo llevará esto.

En el mínimo nivel que está buscando, probablemente medio segundo para el momento en que construye el XML, envía la solicitud HTTP al servidor remoto, que luego tiene que analizar el XML y devolver una respuesta.

  1. Cualquiera sea la aplicación que realizó la consulta INSERT INTO BLAH que provocó el inicio del servicio web, tendrá que esperar a que finalice. A menos que esto sea algo que solo sucede en el fondo como una tarea programada a diario, el rendimiento de su aplicación va a bombardear

  2. El código de invocación del servicio web se ejecuta dentro del servidor SQL y agota sus recursos. Como va a llevar mucho tiempo esperar la solicitud HTTP, terminará consumiendo muchos recursos, lo que afectará una vez más el rendimiento de su servidor.


De acuerdo en que no es algo que quieras hacer, sin embargo, a veces tienes que hacer cosas que idealmente no quieres hacer. En este caso, terminé reescribiendo la función de servicio web como una función sql para realizar la misma tarea.

Gracias por todos los enlaces y sugerencias.


En versiones anteriores de Sql, puede usar un proceso almacenado extendido o xp_cmdshell para pagar y llamar a un servicio web.

No es que ninguno de estos parezca una arquitectura decente, pero a veces tienes que hacer cosas locas.


No en el código T-SQL en sí, pero con SQL Server 2005 y superior, han habilitado la capacidad de escribir procedimientos almacenados CLR, que son esencialmente funciones en código .NET y luego exponerlos como procedimientos almacenados para el consumo. Usted tiene la mayor parte del framework .NET a su alcance para esto, por lo que puedo ver el consumo de un servicio web posible a través de esto.

Es un poco largo discutir en detalle aquí, pero aquí hay un enlace a un artículo de MSDN sobre el tema.


No haría esto para el tráfico pesado o cosas de misión crítica, SIN EMBARGO, si NO necesita recibir comentarios de un servicio, entonces en realidad es una gran cosa que hacer.

Aquí hay un ejemplo de lo que hice.

  1. Desencadena el inserto y la actualización en una tabla
  2. Trigger llamó a Stored Proc que pasa los datos JSON de la transacción a un punto final Web Api que luego se inserta en un MongoDB en AWS.

No hagas el viejo 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)

Ejemplo completo:

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


Puedes hacerlo con los objetos VB incrustados.

Primero crea un objeto VB de tipo ''MSXML2.XMLHttp'' y usa este objeto para todas sus consultas (si lo recrea cada vez espera una penalización de rendimiento).

Luego alimenta ese objeto, algunos parámetros, en un procedimiento almacenado que invoca sp_OAMethod en el objeto.

Perdón por el ejemplo preciso, pero una búsqueda rápida en Google debería revelar cómo se realiza el método vb-script.

-

Pero la versión de CLR es mucho ... MUCHO más fácil. El problema con invocar servicios web es que no pueden seguir el ritmo del motor de DB. Obtendrá muchos errores donde simplemente no puede mantener el ritmo.

Y recuerde, los SERVICIOS web requieren una nueva conexión cada vez. La multiplicidad entra en juego. No desea abrir 5000 conexiones de socket para atender una llamada de función en una tabla. Eso es looney!

En ese caso, tendría que crear una función agregada personalizada y usar ESO como argumento para pasar a su servicio web, que devolvería un conjunto de resultados ... entonces tendría que cotejar eso. Es realmente una forma incómoda de obtener datos.


Sí, puedes crear así

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