我有以下问题:
在一个函数中,我使用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
答案 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