第一步当然是做WebService了。。。这步属于废话,本来就要调用WebService,不做WS的话调用什么。怎么写WebService的教程一搜一大把,忽略之,不会的同学gg一下吧。。。这步的结果是我们得到一个WebService,其地址类似于,后面加上?WSDL就得到其wsdl描述了
这个WebService里有一个名为Service的服务,其中有一个方法叫GetDataURL,其定义为public string GetDataURL(),就是说是一个无参数的方法,返回一个字符串,下一步我们就要调用这个方法了
第二步,重点在此。。。先介绍3个系统存储过程sp_OACreate,sp_OAMethod,sp_OADestroy。
1〉sp_OACreate的作用是建立一个新的对象,类似于ASP里面的Server.CreateObject。接受两个参数,第一个是nvarchar的组件CLSID,第二个是int的返回参数,用来保存建立好的对象实例。准确讲应该是保存了句柄吧
2〉sp_OAMethod,这个存储过程用来执行一个对象里面的方法。参数列表中,第一个参数的int的对象句柄,就是我们刚才返回的那个。第二个参数是要调用的方法名。第三参数是必须用OUT修饰的返回参数,用来保存方法的返回值,返回什么类型就对应转换到SQL数据类型就OK了,这里因为返回string,所以用nvarchar(255)。从第四个参数开始接受方法的参数,有一个写一个就行了,如果WebService的方法定义中有out定义的参数,那么就把存储过程里对应位置的参数加上OUT修饰就可以了。
3〉sp_OADestroy没啥好说的了,销毁前面建立的对象,接受一个int型的参数,就是刚才建立的那个对象句柄。
另外,可以用sp_OAGetErrorInfo获取某一个对象的错误信息,只要把该对象的句柄传进去就行了。
概念介绍完了,直接上代码
CREATE PROCEDURE [dbo].[GetDataURL]
AS
DECLARE @object int
DECLARE @hr int
DECLARE @domain nvarchar(255)
EXEC @hr = sp_OACreate 'MSSOAP.SoapClient', @object OUT
EXEC @hr = sp_OAMethod @object, 'mssoapinit', null, '?WSDL', 'Service'
EXEC @hr = sp_OAMethod @object, 'GetDataURL', @domain OUT
IF @hr <> 0
BEGIN
EXEC sp_OAGetErrorInfo @object
RETURN @object
END
ELSE
BEGIN
RETURN @domain
END
EXEC @hr = sp_OADestroy @object
GO
大致解释一下,就是定义了一个int的@object,用来保存建立的SoapClient对象实例。在后面sp_OACreate 'MSSOAP.SoapClient', @object OUT里面创建了SoapClient的实例,并保存在@object里了。然后执行该对象的mssoapinit方法,初始化soap客户。该方法的声明是HRESULT mssoapinit([in] BSTR bstrWSDLFile,[in, optional, defaultvalue("")] BSTR bstrServiceName,[in, optional, defaultvalue("")] BSTR bstrPort,[in, optional, defaultvalue("")] BSTR bstrWSMLFile);这里偷了个懒,没有处理其返回值,所以执行存储过程的时候用null代替返回值位置。后面三个参数都是可选的,从变量名就能看出其作用,不多说了。再然后,调用GetDataURL方法,并把返回值放在nvarchar的@domain里面。
后面就很简单了,根据各个系统存储过程的执行结果,判断如果不等于0的话,就用sp_OAGetErrorInfo @object来获取@object的错误信息。
最后,调用sp_OADestroy @object清除@object对象。
第三步,定时的问题,再写一个存储过程,调用第二步的存储过程,并且做其他处理。然后在Job里面添加新任务,设定好执行这个存储过程就行了。