Search code examples
sqlsql-servert-sqlsql-server-2000

How to call webservice from TSQL? (SQL SERVER 2000)


I want to call a webservice from TSQL in SQL Server 2000. I tried with the following code:

Declare @Object as Int; 
Declare @ResponseText as Varchar(8000);
Exec sp_OACreate 'MSXML2.XMLHTTP', @Object OUT;
Exec sp_OAMethod @Object, 'open', NULL, 'get','http://server/ws/service1.asmx/Test', 'false';
Exec sp_OAMethod @Object, 'send';
Exec sp_OAMethod @Object, 'responseText', @ResponseText OUTPUT;
Select @ResponseText Resultado;
Exec sp_OADestroy @Object;

For this to work I had to enable Ole Automation:

sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'Ole Automation Procedures', 1;
GO
RECONFIGURE;
GO

In my test server works fine, the problem is that on the production server to run

sp_configure 'Ole Automation Procedures', 1; 

I get the following error:

The configuration option 'Ole Automation Procedures' does not exist, or it may be an advanced option.

When running

exec sp_configure 

on the test server brings the record "Ole Automation Procedures" on the production server not.

Update

I modify the code to catch the error:

Declare @Object as Int; 
Declare @ResponseText as Varchar(8000);
Exec sp_OACreate 'MSXML2.XMLHTTP', @Object OUT;
Exec sp_OAMethod @Object, 'open', NULL, 'get','http://server/ws/service1.asmx/Test', 'false';
Exec sp_OAMethod @Object, 'send';
Exec sp_OAMethod @Object, 'responseText', @ResponseText OUTPUT;
EXEC sp_OAGetErrorInfo @Object
Select @ResponseText Resultado;
Exec sp_OADestroy @Object;

The instruction "sp_OAGetErrorInfo EXEC @ Object" return: (0x8004271A ) Error in srv_convert.

According to Microsoft (link) is a problem of SqlServer. Since in my case the result of the webservice exceed 4000 characters.

How I can call a webservice from TSQL?


Solution

  • I solved it the following way:
    Create a VBScript file (callWS.vbs) with the following code:

    if WScript.Arguments.Count = 1 then
        Set http = CreateObject("Microsoft.XmlHttp")
        http.open "GET", WScript.Arguments(0), FALSE
        http.send ""
        WScript.Echo http.responseText
    else
        WScript.Echo "Not was provided the WS address."
    end if
    

    Then in TSQL:

    declare @Command varchar(100)
    declare @RetInfo varchar(8000)
    select @Command = 'cscript c:\callWS.vbs "http://server/ws/service1.asmx/Test"'
    print @Command
    exec @RetInfo = master.dbo.xp_cmdshell @Command
    print @RetInfo