sp_OAGetProperty 返回 NULL,OUT 变量声明为 MAX
sp_OAGetProperty returning NULL with OUT variable declared as MAX
我有以下问题:
在函数中,我使用 OLE 对象发出 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
这样函数就可以按预期工作:它可以发出 HTTP 请求和 return 我需要的格式的指定信息。
当我声明没有固定长度的变量declare @responseText nvarchar(4000);
时,问题就来了。我需要它是 declare @responseText nvarchar(max);
和变量 declare @binaryResult varbinary(8000);
作为 declare @binaryResult varbinary(max);
,因为我可以收到更长的回复。
当声明为 max
时,用 exec sp_OAGetProperty @token, 'responseText', @responseText out
编辑的值 return 是 NULL
,即使我在使用固定值 (4000) 时得到正确的结果.
我可以遵循哪些解决方法来完成我所寻求的,为什么过程 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
它确实工作正常。
是不是因为程序有限制sp_OAGetProperty
?
编辑
根据评论部分给出的建议,这里是使用存储过程实现所需行为:
create procedure [dbo].[SP_GetRequestHTTP](@url varchar(2048), @reponseType varchar(10) = 'text')
as
begin
declare @responseTable table
(
StatusCode nvarchar(32),
StatusText nvarchar(32),
ResponseText nvarchar(max),
SpErrorMessage varchar(max)
);
declare @responseText table(content nvarchar(max));
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');
select * from @responseTable;
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 table(content varbinary(max));
insert into @binaryResult exec sp_OAGetProperty @token, 'responseBody';
insert into @responseText select top 1 sys.fn_varbintohexstr(content) from @binaryResult;
end
else
insert into @responseText exec sp_OAGetProperty @token, 'responseText'
-- Close the connection
exec @ret = sp_OADestroy @token;
if @ret <> 0
begin
insert into @responseTable (spErrorMessage)
values ('Unable to close HTTP connection')
select * from @responseTable;
return;
end
insert into @responseTable
values (@status, @statusText, (select top 1 * from @responseText), null);
select * from @responseTable;
return;
end
如果您需要获得 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
我有以下问题:
在函数中,我使用 OLE 对象发出 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
这样函数就可以按预期工作:它可以发出 HTTP 请求和 return 我需要的格式的指定信息。
当我声明没有固定长度的变量declare @responseText nvarchar(4000);
时,问题就来了。我需要它是 declare @responseText nvarchar(max);
和变量 declare @binaryResult varbinary(8000);
作为 declare @binaryResult varbinary(max);
,因为我可以收到更长的回复。
当声明为 max
时,用 exec sp_OAGetProperty @token, 'responseText', @responseText out
编辑的值 return 是 NULL
,即使我在使用固定值 (4000) 时得到正确的结果.
我可以遵循哪些解决方法来完成我所寻求的,为什么过程 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
它确实工作正常。
是不是因为程序有限制sp_OAGetProperty
?
编辑
根据评论部分给出的建议,这里是使用存储过程实现所需行为:
create procedure [dbo].[SP_GetRequestHTTP](@url varchar(2048), @reponseType varchar(10) = 'text')
as
begin
declare @responseTable table
(
StatusCode nvarchar(32),
StatusText nvarchar(32),
ResponseText nvarchar(max),
SpErrorMessage varchar(max)
);
declare @responseText table(content nvarchar(max));
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');
select * from @responseTable;
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 table(content varbinary(max));
insert into @binaryResult exec sp_OAGetProperty @token, 'responseBody';
insert into @responseText select top 1 sys.fn_varbintohexstr(content) from @binaryResult;
end
else
insert into @responseText exec sp_OAGetProperty @token, 'responseText'
-- Close the connection
exec @ret = sp_OADestroy @token;
if @ret <> 0
begin
insert into @responseTable (spErrorMessage)
values ('Unable to close HTTP connection')
select * from @responseTable;
return;
end
insert into @responseTable
values (@status, @statusText, (select top 1 * from @responseText), null);
select * from @responseTable;
return;
end
如果您需要获得 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