使用SQLDMO和T-SQL列出所有的实例

使用SQLDMO和T-SQL列出所有的实例

--王成辉翻译整理,转贴请注明出自微软BI开拓者www.windbi.com
--
原帖地址

微软报告的Bug:
SQLDMO.Application对象的方法ListAvailableServers会引起0x800A000E错误。
当从ASP页面执行SQLDMO.Application对象的方法ListAvailableServers,也许会发生下面的错误消息:

Microsoft SQL-DMO (0x800A000E)
[SQL-DMO]Not enough storage is available to complete this operation.


然而,有一些方法可以解决这个问题以得到实例即在ASP上使用客户端脚本。

这里有一个存储过程,我们将准备列出所有可用的实例,所以在你的Web应用程序里很容易展示它们。



CREATE PROCEDURE EnumerateSQLServers
AS

/*
存储过程名称: EnumerateSQLServers
作者            : Srdjan Josipovic
日期            : 2002-06-19
目的            :使用SQLDMO和TSQL列出所有可用的实例

翻译整理      :王成辉


*/

DECLARE @retval int
DECLARE @result varchar(500)
DECLARE @object int
DECLARE @objectList int
DECLARE @src varchar(254)
DECLARE @desc varchar(255)
DECLARE @resultsCount int
DECLARE @counter int
DECLARE @method varchar(255)


--创建SQLDMO对象
EXEC @retval = sp_OACreate 'SQLDMO.Application', @object OUT

--检查对象是否创建成功
IF @retval <> 0
BEGIN
    EXEC sp_OAGetErrorInfo @object, @src OUT, @desc OUT
    SELECT hr=convert(varbinary(4),@retval),
Source=@src, Description=@desc
    RETURN
END

--调用方法ListAvailableServers() , 为SQLDMO.NameList得到Object_ID
EXEC @retval = sp_OAMethod @object , 'ListAvailableSQlServers()' , @objectList OUT

-- 是否有错误?
IF @retval <> 0
BEGIN
    EXEC sp_OAGetErrorInfo @objectList, @src OUT, @desc OUT
    SELECT hr=convert(varbinary(4),@retval),
Source=@src, Description=@desc
    RETURN
END

--计算局域网里的服务器数量
EXEC @retval = sp_OAGetProperty @objectList , 'Count' , @resultsCount OUT

--再一次进行错误处理
IF @retval <> 0
BEGIN
    EXEC sp_OAGetErrorInfo @objectList, @src OUT, @desc OUT
    SELECT hr=convert(varbinary(4),@retval),
Source=@src, Description=@desc
    RETURN
END


--如果有服务器的话,进入处理.....
IF @resultsCount > 0
BEGIN
  SET @counter = 1
  DECLARE @ServersTbl table (ServerID int IDENTITY ,ServerName varchar(255))
  WHILE @counter <= @resultsCount
  BEGIN
    --列出SQL实例:一个名字接一个名字的列出
    SET @method = 'Item(' + convert(varchar(3),@counter) + ')'       
    EXEC @retval = sp_OAGetProperty @objectList ,@method , @result OUT
   
    --将数据存到临时表
    INSERT INTO @ServersTbl (ServerName) SELECT @result
   
    --移到下一条记录
    SET @counter = @counter + 1
  END
END
ELSE
BEGIN
  SET @result = 'No Servers around you'
  INSERT INTO @ServersTbl (ServerName) SELECT @result
END

--释放对象
EXEC @retval = sp_OADestroy @object
IF @retval <> 0
BEGIN
  EXEC sp_OAGetErrorInfo @object, @src OUT, @desc OUT
  SELECT hr=convert(varbinary(4),@retval),
Source=@src, Description=@desc
  RETURN
END


--好了,可以列出所有可用的实例了 ....
SELECT * FROM @ServersTbl
GO


最后编辑拓狼 最后编辑于 2007-07-17 15:04:49
虽有智慧,不如乘势;虽有鎡基,不如待时。
君子学以聚之,问以辨之,宽以居之,仁以行之。
独学而无友,则孤陋而寡闻。