我使用下面的代码来调用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
答案 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。
然而,( 只是为了好玩 )这里是一个关于如何下载和解析彩票号码的工作示例。
两个旁注:
c:\working\lottery.xml
示例强>
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
<强>返回强>