SQL Server 如何从URL下载T-SQL格式的二进制文件

z0qdvdin  于 2023-01-04  发布在  其他
关注(0)|答案(2)|浏览(144)

我正在尝试创建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需要将文件内容返回给调用者。

xkftehaa

xkftehaa1#

我的两分钱(不是答案):当数据大于8K时,sp_OAGetProperty“ResponseBody”无法返回数据(可能只是二进制格式问题)。我一直在努力寻找解决此问题的方法,但最终总是回到原来的位置。
如果图像小于8K,则sp_OAGetProperty可以正常工作,以varbinary形式获取图像。:(

wribegjk

wribegjk2#

试试这个:

declare @responseBody table([responseBody] varbinary(max))

insert into @responseBody([responseBody])
   exec sp_OAGetProperty @obj, 'responseBody', @responseBody out

相关问题