Sql server 通过HTTP GET读取TSQL中的二进制数据

Sql server 通过HTTP GET读取TSQL中的二进制数据,sql-server,tsql,http,binaryfiles,Sql Server,Tsql,Http,Binaryfiles,我需要通过HTTP URL将一些图像导出到我的SQL Server中 我找到了一篇关于导出XML数据的文章: sp_configure 'show advanced options', 1; GO RECONFIGURE; GO sp_configure 'Ole Automation Procedures', 1; GO RECONFIGURE; GO Declare @Object as Int; Declare @ResponseText as Varchar(8000); Decl

我需要通过HTTP URL将一些图像导出到我的SQL Server中

我找到了一篇关于导出XML数据的文章:

sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'Ole Automation Procedures', 1;
GO
RECONFIGURE;
GO

Declare @Object as Int; 
Declare @ResponseText as Varchar(8000); 
Declare @Url as Varchar(MAX); 
select @Url = 'http://somexml.com/xmlfile.xml'

Exec sp_OACreate 'MSXML2.XMLHTTP', @Object OUT; 
Exec sp_OAMethod @Object, 'open', NULL, 'get', @Url, 'false' 
Exec sp_OAMethod @Object, 'send' 
Exec sp_OAMethod @Object, 'responseText', @ResponseText OUTPUT      
Exec sp_OADestroy @Object 

--load into Xml 
Declare @XmlResponse as xml; 
select @ResponseText
在研究过程中,我还发现我应该使用ADODB.Stream来处理二进制数据。但我不知道如何使用上述方法读取此对象。 有没有一种方法可以在纯TSQL中读取二进制数据,或者我应该使用CLR


非常感谢您的帮助。

我和您有同样的问题,并找到了解决方法! 下面是我的sql(它支持检索文本和二进制数据):


希望这有助于其他人:)

我和你有同样的问题,并找到了解决方法! 下面是我的sql(它支持检索文本和二进制数据):


希望这对其他人有所帮助:)

编写.NET程序下载文件,然后将其加载到数据库中会更容易。如果需要,可以将其作为服务运行,也可以使用SQL代理进行调度。TSQL通常不是一种处理数据库之外任何东西的好语言,尽管加载二进制文件是可能的,并且已经被问了很多次,例如……是的,我看到了这些问题,但openrowset不适用于http。正确,我评论的要点是无论如何都不应该在TSQL中这样做,您应该在外部程序中执行此操作。并非所有事情都可以或应该在数据库内部完成:TSQL可以从文件系统加载二进制文件,但它不支持HTTP或其他协议。如果您必须在数据库中执行此操作,则可以编写SQLCLR过程,但我不建议这样做。编写.NET程序下载文件,然后将其加载到数据库中会更容易。如果需要,可以将其作为服务运行,也可以使用SQL代理进行调度。TSQL通常不是一种处理数据库之外任何东西的好语言,尽管加载二进制文件是可能的,并且已经被问了很多次,例如……是的,我看到了这些问题,但openrowset不适用于http。正确,我评论的要点是无论如何都不应该在TSQL中这样做,您应该在外部程序中执行此操作。并非所有事情都可以或应该在数据库内部完成:TSQL可以从文件系统加载二进制文件,但它不支持HTTP或其他协议。如果您必须在数据库中执行此操作,那么您可以编写SQLCLR过程,但我不建议这样做。这适用于小图像,但对于大于8K的文件返回NULL。有没有办法获得更大的图像?这适用于小图像,但对于大于8K的文件返回NULL。有没有办法得到更大的图像?
EXEC sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
EXEC sp_configure 'Ole Automation Procedures', 1;
GO
RECONFIGURE;
GO

declare @xmlObject as int
declare @responseText as varchar(max)
declare @responseBody as varbinary(max)
declare @status as int
declare @url as varchar(2048)

select @url = 'http://someurl.com/someimage.jpg'

exec sp_OACreate 'MSXML2.XMLHTTP', @xmlObject OUT;
exec sp_OAMethod @xmlObject, 'open', NULL, 'get', @url, 'false'
exec sp_OAMethod @xmlObject, 'send'
exec sp_OAMethod @xmlObject, 'status', @status OUTPUT
exec sp_OAMethod @xmlObject, 'responsetext', @responseText OUTPUT
declare @responseTable as table ( body varbinary(max) )
INSERT INTO @responseTable exec sp_OAMethod @xmlObject, 'responsebody'
exec sp_OADestroy @xmlObject

select @status
select @responseText
select @responseBody=body from @responseTable    
select @responseBody