Olá pessoas,
Como nem sempre será possível usar SQL CLR para acessar um Web Service no SQL Server 2005+, seja pelo fato de você estar trabalhando com um SQL Server 2000 ou por não permitirem usar SQL CLR em alguns cenários, nos restam poucas alternativas.
Uma alternativa “simples” e forma a manter este processo em T-SQL, é o uso de os componentes COM+ ou OLE (como preferir), com o qual teremos um script T-SQL um pouco estranho, inseguro e instável na maioria das vezes, semelhante a um script feito em VBScript ou ASP Classic.
Se não conhecem VBScript, abaixo segue um exemplo de script para ler o retorno de Web Service que recupera dados sobre a temperatura de uma determinada cidade:
Dim objHTTP, strResponse, url
set objHTTP = CreateObject("Microsoft.XMLHTTP")
'set objHTTP = CreateObject("Msxml2.XMLHTTP")
url = "http://www.webservicex.net/globalweather.asmx/GetWeather?CityName=CURITIBA&CountryName=BRAZIL"
objHTTP.Open "get", url, False
objHTTP.Send()
strResponse = objHTTP.responseText
MsgBox strResponse
No SQL Server, o uso de componentes COM+ é feito por procedures específicas, as Ole Automation Procedures, que não estão habilitadas por padrão (ainda bem). Logo se faz necessário habilitá-las, já que vamos fazer uso delas neste artigo:
EXEC sp_configure 'show advanced options', 1 GO RECONFIGURE GO EXEC sp_configure 'Ole Automation Procedures', 1 GO RECONFIGURE GO EXEC sp_configure 'show advanced options', 0 GO RECONFIGURE GO
Por padrão as Ole Automation Procedures são exclusivas do “sysadmin”, mas é possível dar permissão para executá-las aos usuários do banco de dados “master”, exemplo (para permissão destas procedures em outros bancos de dados, confira os artigos relacionados):
USE master GO CREATE LOGIN [Maria] WITH PASSWORD=N'1234' , CHECK_EXPIRATION=OFF , CHECK_POLICY=OFF GO CREATE USER [Maria] FOR LOGIN [Maria] GO GRANT EXECUTE ON sys.sp_OACreate TO [Maria] GO GRANT EXECUTE ON sys.sp_OAMethod TO [Maria] GO GRANT EXECUTE ON sys.sp_OADestroy TO [Maria] GO EXECUTE AS LOGIN = 'Maria' GO
Para o nosso exemplo, vou utilizar a mesma ideia do que foi feito em VBScript, para recuperar a temperatura da cidade de Curitiba do Web Service pelo SQL Server:
DECLARE @objHTTP INT, @url VARCHAR(255)
DECLARE @return INT, @responseXml INT, @text NVARCHAR(4000), @xml XML
-- Criando a 'instância' do componentes
EXEC @return = sp_OACreate 'Microsoft.XMLHTTP', @objHTTP OUT
-- Componente alternativo
-- EXEC @return = sp_OACreate 'Msxml2.XMLHTTP', @objHTTP OUT
-- Verificando se a chamada obteve sucesso.
IF @return = 0 PRINT 'COM... OK'
SET @url = 'http://www.webservicex.net/globalweather.asmx/GetWeather?CityName=CURITIBA&CountryName=BRAZIL'
-- Chamando o método Open, informando a url
EXEC @return = sp_OAMethod @objHTTP, 'Open', NULL, 'GET', @url, 0
IF @return = 0 PRINT 'Open... OK'
-- Chamando o método Send
EXEC @return = sp_OAMethod @objHTTP, 'Send'
IF @return = 0 PRINT 'Send... OK'
-- Recuperando a resposta do Web Service
EXEC @return = sp_OAMethod @objHTTP, 'ResponseXML', @responseXml OUT
IF @return = 0 PRINT 'ResponseXML... OK'
-- Extraindo uma parte específica da resposta
EXEC @return = sp_OAMethod @responseXml, 'Text', @text OUT
IF @return = 0 PRINT 'Text... OK'
-- Recuperando a temperatura
SET @xml = CAST(@text AS XML)
SELECT @xml.value('(/CurrentWeather/Temperature)[1]', 'varchar(20)')
GO
Assim como qualquer outra feature, use-a com moderação, e esperamos que ela não venha mais existir em futuras versão do SQL Server já que pode ser facilmente e melhor substituida por SQL CLR.
Artigos relacionados:
Delegando permissões e acesso entre bancos de dados por meio de certificados no SQL Server