使用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
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
http://topic.csdn.net/u/20071107/12/76f7f073-6acc-470b-be80-dff71d583923.html