Acessando dados de Web Service com Ole Automation Procedures

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

Delegando permissões e acesso entre bancos de dados por meio do Cross DB Ownership Chaining no SQL Server

Um pensamento sobre “Acessando dados de Web Service com Ole Automation Procedures

  1. Pingback: Desenvolvendo componentes COM+ com .NET « SQL From Hell.com

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s