0

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

4

1 回答 1

0

尝试这个:

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

insert into @responseBody([responseBody])
   exec sp_OAGetProperty @obj, 'responseBody', @responseBody out 
于 2021-09-04T17:34:35.270 回答