sp_OAGetProperty返回NULL,OUT变量声明为MAX

时间:2018-04-09 20:42:32

标签: sql function tsql xmlhttprequest ole

我有以下问题:

在一个函数中,我使用OLE对象发出HTTP请求。该函数声明如下:

white

这样,该函数按预期工作:它可以发出HTTP请求并以我需要的格式返回指定的信息。

当我声明变量function [dbo].[FN_GetRequestHTTP](@url varchar(2048), @reponseType varchar(10) = 'text') returns @responseTable table ( StatusCode nvarchar(32), StatusText nvarchar(32), ResponseText nvarchar(max), SpErrorMessage varchar(max) ) as begin declare @responseText nvarchar(4000); declare @ret int; declare @status nvarchar(32); declare @statusText nvarchar(32); declare @spErrorMessages nvarchar(4000); declare @token int; -- Open the connection exec @ret = sp_OACreate 'MSXML2.ServerXMLHTTP', @token out; if @ret <> 0 begin insert into @responseTable (spErrorMessage) values ('Unable to open HTTP connection'); return; end -- Send the request exec @ret = sp_OAMethod @token, 'open', null, 'GET', @url, 'false'; exec @ret = sp_OAMethod @token, 'send', null, null; -- Handle the response exec @ret = sp_OAGetProperty @token, 'status', @status out; exec @ret = sp_OAGetProperty @token, 'statusText', @statusText out; if @reponseType = 'binary' begin declare @binaryResult varbinary(8000); exec sp_OAGetProperty @token, 'responseBody', @binaryResult out; set @responseText = upper(sys.fn_varbintohexstr(@binaryResult)); end else exec sp_OAGetProperty @token, 'responseText', @responseText out -- Close the connection exec @ret = sp_OADestroy @token; if @ret <> 0 begin insert into @responseTable (spErrorMessage) values ('Unable to close HTTP connection') return; end insert into @responseTable values (@status, @statusText, @responseText, null); return; end 没有固定长度时,就会出现问题。我需要它为declare @responseText nvarchar(4000);而变量declare @responseText nvarchar(max);declare @binaryResult varbinary(8000);,因为我可以收到更长的回复。

当声明为declare @binaryResult varbinary(max);时,max返回的值为exec sp_OAGetProperty @token, 'responseText', @responseText out,即使我在使用固定值(4000)时得到正确的结果。

我可以遵循哪些变通方法来完成我所寻求的内容以及为什么会在NULL过程中发生这种情况?因为我创建了一个虚拟过程,如下所示:

sp_OAGetProperty

并按照以下方式执行:

create procedure SP_ToDeleteAfterTest (@temp varchar(50) out)
as
begin
    set @temp = 'Testing';

    print 'Done'
end

它确实运作正常。

是否因为程序declare @dunno varchar(max) exec dbo.SP_ToDeleteAfterTest @dunno out select @dunno 存在约束?

修改

遵循评论中给出的建议&#39;部分,这是使用存储过程

实现所需行为
sp_OAGetProperty

1 个答案:

答案 0 :(得分:2)

如果您需要以XML格式获取响应,则应该这样做:

declare @Result int
declare @xml table(Content xml)

INSERT INTO @xml(Content)
EXEC @Result = sp_OAGetProperty @token, 'responseXML.xml'--, @responseText OUT

select * from @xml

代替

exec sp_OAGetProperty @token, 'responseText', @responseText out

关注此链接: https://social.msdn.microsoft.com/Forums/sqlserver/en-US/ac224833-1ffa-4008-880c-ce8f4d442110/trying-to-obtain-xml-data-from-url-via-sql?forum=sqlxml