从SQL存储过程调用SOAP Web服务

时间:2014-10-06 09:23:37

标签: sql-server web-services tsql sql-server-2012 clr

我正在尝试在TSQL中构建一个存储过程来调用Web服务。我以前在Oracle中做过这个,但在MSSQL中似乎并不那么容易。 当然,有很多理由不在存储过程中执行此操作,但由于此过程仅用于每日批处理,因此性能不是太大的问题。 我想要做的事情如下:向webservice发送一个全名,webservice将返回一个名称,分为名字,前缀,姓氏等。返回的值将需要写入表。< / p>

我在http://www.vishalseth.com/post/2009/12/22/Call-a-webservice-from-TSQL-(Stored-Procedure)-using-MSXML.aspx找到了一个有趣的程序,似乎完全符合我的要求,但只要你在调用中添加一个主体,就会遇到“参数不正确”之类的错误。这篇文章也说明了这一点,显然没有简单的解决方案。我绝对需要发送请求正文。

我还阅读了很多关于使用CLI或“Web服务任务编辑器”解决它的文章,或“SSIS”位,我找不到任何关于从哪里开始的教程。现在我只有Microsoft SQL服务器管理工​​作室。

顺便说一句,我在SQL Server 2012上。

关于我应该采取什么方向的任何想法?

我已经找到了这个描述,看起来很干净:http://www.databasejournal.com/features/mssql/article.php/3821271/Calling-a-Web-Service-from-within-SQL-Server.htm但是,在安装visual studio 2012并创建“SQL服务器数据库项目”之后,我无法选择“添加Web引用”。解决方案上下文菜单,菜单中只有nu这样的选项。

4 个答案:

答案 0 :(得分:6)

过去我使用过以下方法,现在可能不是最好的方法,但它对我来说成功了:

DECLARE @obj int,
        @url VarChar(MAX),
        @response VarChar(MAX),
        @requestHeader VarChar(MAX),
        @requestBody VarChar(MAX)

SET @url = 'http://....'

SET @requestBody = '<soapenv:Envelope>
                     <soapenv:Header/>
                      <soapenv:Body>
                       ...
                      </soapenv:Body>
                     </soapenv:Envelope>'

EXEC sp_OACreate 'MSXML2.ServerXMLHttp', @obj OUT
EXEC sp_OAMethod @obj, 'Open', NULL, 'GET', @url, false
EXEC sp_OAMethod @obj, 'setRequestHeader', NULL, 'Content-Type', 'text/xml;charset=UTF-8'
EXEC sp_OAMethod @obj, 'setRequestHeader', NULL, 'SOAPAction', 'POST'
EXEC sp_OAMethod @obj, 'setRequestHeader', NULL, 'Content-Length', LEN(@requestBody)
EXEC sp_OAMethod @obj, 'send', NULL, @requestBody
EXEC sp_OAGetProperty @obj, 'responseText', @response OUT


SELECT @response [RESPONSE]

EXEC sp_OADestroy @obj

我用它来调用一个Web服务,它生成一个报告并在方法中通过电子邮件发送它。

答案 1 :(得分:2)

根据自己的需要制作这个怪物

cellForRowAtIndexPath

编辑:格式化

答案 2 :(得分:2)

我也遇到了这个问题。这是使用来自T-SQL的参数执行HTTP Post的正确方法:

DECLARE @authHeader NVARCHAR(64);
DECLARE @contentType NVARCHAR(64);
DECLARE @postData NVARCHAR(2000);
DECLARE @responseText NVARCHAR(2000);
DECLARE @responseXML NVARCHAR(2000);
DECLARE @ret INT;
DECLARE @status NVARCHAR(32);
DECLARE @statusText NVARCHAR(32);
DECLARE @token INT;
DECLARE @url NVARCHAR(256);

SET @authHeader = 'BASIC 0123456789ABCDEF0123456789ABCDEF';
SET @contentType = 'application/x-www-form-urlencoded';
SET @postData = 'value1=Hello&value2=World'
SET @url = 'https://requestb.in/16xdq1p1'

-- Open the connection.
EXEC @ret = sp_OACreate 'MSXML2.ServerXMLHTTP', @token OUT;
IF @ret <> 0 RAISERROR('Unable to open HTTP connection.', 10, 1);

-- Send the request.
EXEC @ret = sp_OAMethod @token, 'open', NULL, 'POST', @url, 'false';
EXEC @ret = sp_OAMethod @token, 'setRequestHeader', NULL, 'Authentication', @authHeader;
EXEC @ret = sp_OAMethod @token, 'setRequestHeader', NULL, 'Content-type', @contentType;
EXEC @ret = sp_OAMethod @token, 'send', NULL, @postData;

-- Handle the response.
EXEC @ret = sp_OAGetProperty @token, 'status', @status OUT;
EXEC @ret = sp_OAGetProperty @token, 'statusText', @statusText OUT;
EXEC @ret = sp_OAGetProperty @token, 'responseText', @responseText OUT;

-- Show the response.
PRINT 'Status: ' + @status + ' (' + @statusText + ')';
PRINT 'Response text: ' + @responseText;

-- Close the connection.
EXEC @ret = sp_OADestroy @token;
IF @ret <> 0 RAISERROR('Unable to close HTTP connection.', 10, 1);

Credit goes to the original author.

编辑:我在此处调用的示例服务似乎已关闭。您将需要换出URL并将其发布到另一个端点,以查看它是否有效。

答案 3 :(得分:0)

在Visual Studio中维护SQL Server项目时,无法以通常的方式添加Web引用。但是,您可以使用WSDL实用程序创建Web Interface并将其添加到您的解决方案中。随后,您将能够访问CLR存储过程中所需的Web方法。

WSDL.exe实用程序可以在已安装的Microsoft SDK中找到,我使用Windows 7版本运行,但是只需简单搜索一下你的hdd就可以找到你的位置,它安装在以下目录中:C:\ Program文件(x86)\ Microsoft SDKs \ Windows \ v7.0A \ Bin

运行WSDL.exe实用程序时使用的命令是:

WSDL.exe /o:(name of Visual Studio Class file) /n:(name of namespace) (address of webservice)

例如:

WSDL.exe /o:Weather.cs /n:Weather.Test http://http://wsf.cdyne.com/WeatherWS/Weather.asmx

这将在此实例中生成一个Weather.cs文件,然后您可以将其添加到项目中并在方法中调用。