我正在尝试创建SQL Server存储过程,以便从指定的URL下载未知的二进制文件类型(通常为jpg、pdf、zip、rtf或doc)。
在执行该脚本时,我已经验证了URL被调用并且文件被正确下载(其他服务也使用相同的URL),但是脚本没有获取文件内容。
create procedure DownloadFile (@Url varchar(1024))
AS
BEGIN
SET NOCOUNT ON;
declare @obj int
declare @responseBody varchar(8000)
declare @status varchar(50)
declare @statusText varchar(1024)
exec sp_OACreate 'Msxml2.XMLHTTP', @obj out
exec sp_OAMethod @obj, 'Open', null, 'GET', @Url, false
exec sp_OAMethod @obj, 'send'
exec sp_OAGetProperty @obj, 'responseBody', @responseBody out
exec sp_OAGetProperty @obj, 'status', @status out
exec sp_OAGetProperty @obj, 'statusText', @statusText out
exec sp_OADestroy @obj
select @responseBody as responseBody,datalength(@responseBody) as responseBodyDataLength, @status as [status], @statusText as [statusText]
END
显然,@responseBody类型需要是某种二进制类型,但是当我使用任何二进制类型(如binary、varbinary或image)时,@responseBody总是NULL。
当我将@responseBody声明为一个varchar(8000)时,它最终得到了这个奇怪的9个字符长的字符串:'????AA??'。但是如果我将@responseBody声明为一个varchar(max),它最终会为NULL。
我很困惑。
一旦我让它工作起来,sp需要将文件内容返回给调用者。
2条答案
按热度按时间xkftehaa1#
我的两分钱(不是答案):当数据大于8K时,sp_OAGetProperty“ResponseBody”无法返回数据(可能只是二进制格式问题)。我一直在努力寻找解决此问题的方法,但最终总是回到原来的位置。
如果图像小于8K,则sp_OAGetProperty可以正常工作,以varbinary形式获取图像。:(
wribegjk2#
试试这个: