2013-02-15 2 views
1

Мне нужно экспортировать некоторые изображения в мой SQL Server по URL-адресу HTTP.Чтение двоичных данных в TSQL через HTTP 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 Agent, если хотите. TSQL обычно не является хорошим языком для работы с чем-либо за пределами базы данных, хотя загрузка двоичных файлов возможна и задана много раз, например. [этот вопрос] (http://stackoverflow.com/questions/3925656/importing-images-in-sql-server-2005). – Pondlife

+0

Да, я видел эти вопросы, но openrowset не работает с http. –

+0

Правильно, и главным моментом моего комментария было то, что вы не должны делать это в TSQL в любом случае, вы должны сделать это во внешней программе. Не все может или должно быть сделано внутри базы данных: TSQL может загружать двоичные файлы из файловой системы, но не поддерживает HTTP или другие протоколы. Если вы абсолютно должны сделать это в базе данных, тогда вы можете написать процедуру SQLCLR, но я бы не рекомендовал ее. – Pondlife

ответ

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 

Надеется, что это помогает Сомон там :)

Смежные вопросы