如何从t-sql调用Web服务

时间:2017-09-07 18:16:50

标签: sql-server sql-server-2008 tsql

我使用下面的代码来调用Web服务,但它返回空值。

请帮助我:

Declare @Object as Int;
Declare @ResponseText as Varchar(8000);

Exec sp_OACreate 'MSXML2.XMLHTTP', @Object OUT;
Exec sp_OAMethod @Object, 'open', NULL, 'get', 'http://usadc-vsbbmd02:8085/rest/api/latest/plan/EP-AR','false'
Exec sp_OAMethod @Object, 'send'
Exec sp_OAMethod @Object, 'responseText', @ResponseText OUTPUT
Select @ResponseText
Exec sp_OADestroy @Object

2 个答案:

答案 0 :(得分:1)

您应该使用SQLCLR或外部程序。在SQL 20106中,您可以使用TS中的R,而在SQL 2017中,您也可以使用Python。从TSQL进行Web服务调用很少是个好主意,如果你这样做,通常应该从队列中提取。在这种情况下,您可以使用外部程序。

sp_oaxxx过程是旧的,难以使用,鲜为人知,需要危险的服务器配置等等。

话虽如此,我在很长一段时间之前写过一些我从usenet挖出来的代码:

create procedure http_get( @sUrl varchar(200), @response varchar(8000) out)
As
begin
    Declare
      @obj   int
     ,@hr   int
     ,@status int
     ,@msg varchar(255)

       exec @hr = sp_OACreate 'MSXML2.ServerXMLHttp', @obj OUT
       if @hr < 0 begin Raiserror('sp_OACreate MSXML2.ServerXMLHttp failed', 16,1) return 1 end
       exec @hr = sp_OAMethod @obj, 'Open', NULL, 'GET', @sUrl, false
       if @hr <0 begin set @msg = 'sp_OAMethod Open failed' goto eh end
       exec @hr = sp_OAMethod @obj, 'send'
       if @hr <0 begin  set @msg = 'sp_OAMethod Send failed' goto eh end
       exec @hr = sp_OAGetProperty @obj, 'status', @status OUT
       if @hr <0 begin  set @msg = 'sp_OAMethod read status failed' goto eh end
       if @status <> 200  begin set @msg = 'sp_OAMethod http status ' + str(@status) goto eh end
       exec @hr = sp_OAGetProperty @obj, 'responseText', @response OUT
       if @hr <0 begin  set @msg = 'sp_OAMethod read response failed' goto eh end
       exec @hr = sp_OADestroy @obj
       return 0
    eh:
      exec @hr = sp_OADestroy @obj
      Raiserror(@msg, 16, 1)
      return 1
end

答案 1 :(得分:1)

我倾向于通过我的网络服务器调用Web服务。正如David Browne正确地指出,实际上不建议通过TSQL。

然而,( 只是为了好玩 )这里是一个关于如何下载和解析彩票号码的工作示例。

两个旁注:

  1. 下载的文件大小几乎没有限制
  2. 显然,您必须从c:\working\lottery.xml
  3. 更改目标/源文件夹

    示例

    exec master..xp_cmdshell 'powershell.exe Invoke-WebRequest "http://data.ny.gov/resource/d6yy-54nr.xml" -OutFile "c:\working\lottery.xml"',no_output
    
    Declare @XML xml; 
    Select @XML = BulkColumn FROM  OPENROWSET(BULK 'c:\working\lottery.xml', SINGLE_BLOB) x; 
    
    Select A.*
          ,Pos1  = B.Pos1
          ,Pos2  = B.Pos2
          ,Pos3  = B.Pos3
          ,Pos4  = B.Pos4
          ,Pos5  = B.Pos5
          ,PBall = B.Pos6
     From (
            Select [DrawDate]   = r.n.value('(draw_date)[1]','date')
                  ,[Numbers]    = r.n.value('(winning_numbers)[1]','varchar(50)')
                  ,[Multiplier] = r.n.value('(multiplier)[1]','varchar(50)')
             From  @XML.nodes('response/row/*') r(n)
          ) A      
     Cross Apply (
                    Select Pos1 = ltrim(rtrim(xDim.value('/x[1]','varchar(max)')))
                          ,Pos2 = ltrim(rtrim(xDim.value('/x[2]','varchar(max)')))
                          ,Pos3 = ltrim(rtrim(xDim.value('/x[3]','varchar(max)')))
                          ,Pos4 = ltrim(rtrim(xDim.value('/x[4]','varchar(max)')))
                          ,Pos5 = ltrim(rtrim(xDim.value('/x[5]','varchar(max)')))
                          ,Pos6 = ltrim(rtrim(xDim.value('/x[6]','varchar(max)')))
                    From  (Select Cast('<x>' + replace(A.Numbers,' ','</x><x>')+'</x>' as xml) as xDim) as A 
                 ) B
     Order By DrawDate Desc
    

    <强>返回

    enter image description here