2013-02-15 51 views
1

我需要通过HTTP URL将一些图像导出到我的SQL Server中。通过HTTP读取TSQL中的二进制数据GET

我发现一篇关于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呢?

非常感谢您的帮助。

+0

这将是更容易编写一个.NET程序下载文件,然后将它们加载到数据库中。如果需要,可以将其作为服务运行或使用SQL代理进行安排。尽管加载二进制文件是可能的并且已经被多次询问,但是TSQL通常不是处理数据库之外的任何事物的良好语言。 [这个问题](http://stackoverflow.com/questions/3925656/importing-images-in-sql-server-2005)。 – Pondlife 2013-02-15 20:06:46

+0

是的,我看到了这些问题,但openrowset不适用于http。 – 2013-02-15 22:39:03

+0

正确,我的评论的主要观点是你不应该在TSQL中这样做,你应该在外部程序中完成。并非所有事情都可以或应该在数据库内完成:TSQL可以从文件系统加载二进制文件,但它不支持HTTP或其他协议。如果您绝对必须在数据库中执行此操作,则可以编写SQLCLR过程,但我不会推荐它。 – Pondlife 2013-02-15 22:46:04

回答

3

我和你有同样的问题,并发现如何做到这一点! 这里是我的SQL这样做(它支持文本和二进制数据的检索):

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 

希望这有助于有人为在那里:)