• SQL Server 通过TSQL(存储过程)用MSXML去调用Webservice


    本文为转载:原文地址

    在SQL SERVER 2008 R2 上亲测可用,

    这个存储过程配合SoapUI使用效果更好:参考地址

    前提设置:http://www.cnblogs.com/chenxizhang/archive/2009/04/15/1436747.html

    1.打开方面

    2.方面选中"外围应用配置器"->OleAutomationEnabled->True

     

    以下为存储过程

    CREATE proc [dbo].[spHTTPRequest] 
          @URI varchar(2000) = '',      
          @methodName varchar(50) = '', 
          @requestBody varchar(8000) = '', 
          @SoapAction varchar(255), 
          @UserName nvarchar(100), -- DomainUserName or UserName 
          @Password nvarchar(100), 
          @responseText varchar(8000) output
    as
    SET NOCOUNT ON
    IF    @methodName = ''
    BEGIN
          select FailPoint = 'Method Name must be set'
          return
    END
    set   @responseText = 'FAILED'
    DECLARE @objectID int
    DECLARE @hResult int
    DECLARE @source varchar(255), @desc varchar(255) 
    EXEC @hResult = sp_OACreate 'MSXML2.ServerXMLHTTP', @objectID OUT
    IF @hResult <> 0 
    BEGIN
          EXEC sp_OAGetErrorInfo @objectID, @source OUT, @desc OUT
          SELECT      hResult = convert(varbinary(4), @hResult), 
                      source = @source, 
                      description = @desc, 
                      FailPoint = 'Create failed', 
                      MedthodName = @methodName 
          goto destroy 
          return
    END
    -- open the destination URI with Specified method 
    EXEC @hResult = sp_OAMethod @objectID, 'open', null, @methodName, @URI, 'false', @UserName, @Password
    IF @hResult <> 0 
    BEGIN
          EXEC sp_OAGetErrorInfo @objectID, @source OUT, @desc OUT
          SELECT      hResult = convert(varbinary(4), @hResult), 
                source = @source, 
                description = @desc, 
                FailPoint = 'Open failed', 
                MedthodName = @methodName 
          goto destroy 
          return
    END
    -- set request headers 
    EXEC @hResult = sp_OAMethod @objectID, 'setRequestHeader', null, 'Content-Type', 'text/xml;charset=UTF-8'
    IF @hResult <> 0 
    BEGIN
          EXEC sp_OAGetErrorInfo @objectID, @source OUT, @desc OUT
          SELECT      hResult = convert(varbinary(4), @hResult), 
                source = @source, 
                description = @desc, 
                FailPoint = 'SetRequestHeader failed', 
                MedthodName = @methodName 
          goto destroy 
          return
    END
    -- set soap action 
    EXEC @hResult = sp_OAMethod @objectID, 'setRequestHeader', null, 'SOAPAction', @SoapAction 
    IF @hResult <> 0 
    BEGIN
          EXEC sp_OAGetErrorInfo @objectID, @source OUT, @desc OUT
          SELECT      hResult = convert(varbinary(4), @hResult), 
                source = @source, 
                description = @desc, 
                FailPoint = 'SetRequestHeader failed', 
                MedthodName = @methodName 
          goto destroy 
          return
    END
    declare @len int
    set @len = len(@requestBody) 
    EXEC @hResult = sp_OAMethod @objectID, 'setRequestHeader', null, 'Content-Length', @len 
    IF @hResult <> 0 
    BEGIN
          EXEC sp_OAGetErrorInfo @objectID, @source OUT, @desc OUT
          SELECT      hResult = convert(varbinary(4), @hResult), 
                source = @source, 
                description = @desc, 
                FailPoint = 'SetRequestHeader failed', 
                MedthodName = @methodName 
          goto destroy 
          return
    END
    /* 
    -- if you have headers in a table called RequestHeader you can go through them with this 
    DECLARE @HeaderKey varchar(500), @HeaderValue varchar(500) 
    DECLARE RequestHeader CURSOR
    LOCAL FAST_FORWARD 
    FOR
          SELECT      HeaderKey, HeaderValue 
          FROM RequestHeaders 
          WHERE       Method = @methodName 
    OPEN RequestHeader 
    FETCH NEXT FROM RequestHeader 
    INTO @HeaderKey, @HeaderValue 
    WHILE @@FETCH_STATUS = 0 
    BEGIN
          --select @HeaderKey, @HeaderValue, @methodName 
          EXEC @hResult = sp_OAMethod @objectID, 'setRequestHeader', null, @HeaderKey, @HeaderValue 
          IF @hResult <> 0 
          BEGIN
                EXEC sp_OAGetErrorInfo @objectID, @source OUT, @desc OUT
                SELECT      hResult = convert(varbinary(4), @hResult), 
                      source = @source, 
                      description = @desc, 
                      FailPoint = 'SetRequestHeader failed', 
                      MedthodName = @methodName 
                goto destroy 
                return
          END
          FETCH NEXT FROM RequestHeader 
          INTO @HeaderKey, @HeaderValue 
    END
    CLOSE RequestHeader 
    DEALLOCATE RequestHeader 
    */ 
    -- send the request 
    EXEC @hResult = sp_OAMethod @objectID, 'send', null, @requestBody 
    IF    @hResult <> 0 
    BEGIN
          EXEC sp_OAGetErrorInfo @objectID, @source OUT, @desc OUT
          SELECT      hResult = convert(varbinary(4), @hResult), 
                source = @source, 
                description = @desc, 
                FailPoint = 'Send failed', 
                MedthodName = @methodName 
          goto destroy 
          return
    END
    declare @statusText varchar(1000), @status varchar(1000) 
    -- Get status text 
    exec sp_OAGetProperty @objectID, 'StatusText', @statusText out
    exec sp_OAGetProperty @objectID, 'Status', @status out
    select @status, @statusText, @methodName 
    -- Get response text 
    exec sp_OAGetProperty @objectID, 'responseText', @responseText out
    IF @hResult <> 0 
    BEGIN
          EXEC sp_OAGetErrorInfo @objectID, @source OUT, @desc OUT
          SELECT      hResult = convert(varbinary(4), @hResult), 
                source = @source, 
                description = @desc, 
                FailPoint = 'ResponseText failed', 
                MedthodName = @methodName 
          goto destroy 
          return
    END
    destroy: 
          exec sp_OADestroy @objectID 
    SET NOCOUNT OFF
     
    GO

    存储过程参数说明

    1.@URI: the URI of the web service
    2.@MethodName: this would be ‘GET’ or ‘POST’
    3.@RequestBody: this is your SOAP xml that you want to send
    4.@SoapAction: this the operation that you want to call on your service
    5.@UserName: NT UserName if your web service requires authentication
    6.@Password: the password if using NT Authentication on the web service
    7.@ResponseText: this is an out parameter that contains the response from the web service

    调用方法

    declare @xmlOut varchar(8000)
    Declare @RequestText as varchar(8000);
    set @RequestText=
    '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/">
       <soapenv:Header/>
       <soapenv:Body>
          <tem:CreateOrder>
             <!--Optional:-->
             <tem:OrderRequest>
                <tem:OrderId>200</tem:OrderId>
                <!--Optional:-->
                <tem:OrderName>something</tem:OrderName>
             </tem:OrderRequest>
          </tem:CreateOrder>
       </soapenv:Body>
    </soapenv:Envelope>'
    exec spHTTPRequest 
    'http://localhost/testwebservices/helloworldservice.asmx', 
    'POST', 
    @RequestText,
    'http://tempuri.org/CreateOrderForMe',
    '', '', @xmlOut out
    select @xmlOut 

     转载请注明出处,by lazyneal 2017

  • 相关阅读:
    【Sharding-JDBC】配置手册
    【Sharding-JDBC】数据脱敏
    【Sharding-JDBC】分布式事务
    【Sharding-JDBC】编排治理
    【Sharding-JDBC】强制路由
    【Sharding-JDBC】不支持项
    【Sharding-JDBC】读写分离
    【Sharding-JDBC】数据分片
    apache commons configuration
    【Sharding-JDBC】简介
  • 原文地址:https://www.cnblogs.com/lazyneal/p/6306787.html
Copyright © 2020-2023  润新知