2013-02-15 96 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 

希望這有助於有人爲在那裏:)