(上面提到的是代码实现的方法,若在客户机上没有安装SQLDMO.Application则不能用!)
考虑到一般sql server 主机上一般都安装了SQLDMO.Application,因此想到了用sql语句直
接取回结果! 其语句如下
我现在一直都采用这方法,效果很好)
//add chji 2002-12-11
//取得目标机上局网内的SQL主机
function GetSQlList(AdoQuery:Tadoquery): String;
begin
AdoQuery.Close;
AdoQuery.SQL.Clear;
AdoQuery.SQL.Add('DECLARE @SqlServer int,@ListAvailableSQLServers int');
AdoQuery.SQL.Add('DECLARE @Count int,@i int,@str varchar(500),@str2 varchar(500)');
AdoQuery.SQL.Add('DECLARE @hr int,@src varchar(255), @desc varchar(255)');
AdoQuery.SQL.Add('EXEC @hr = sp_OACreate ''SQLDMO.Application'', @SqlServer OUT');
AdoQuery.SQL.Add('IF @hr <> 0');
AdoQuery.SQL.Add('BEGIN');
AdoQuery.SQL.Add(' EXEC sp_OAGetErrorInfo @SqlServer, @src OUT, @desc OUT');
AdoQuery.SQL.Add(' SELECT hr=convert(varbinary(4),@hr), Source=@src, Description=@desc');
AdoQuery.SQL.Add(' RETURN');
AdoQuery.SQL.Add('END');
AdoQuery.SQL.Add('EXEC @hr = sp_OAMethod @SqlServer, ''ListAvailableSQLServers'',@ListAvailableSQLServers out');
AdoQuery.SQL.Add('IF @hr <> 0');
AdoQuery.SQL.Add(' begin');
AdoQuery.SQL.Add(' EXEC sp_OAGetErrorInfo @ListAvailableSQLServers, @src OUT, @desc OUT');
AdoQuery.SQL.Add(' SELECT hr=convert(varbinary(4),@hr), Source=@src, Description=@desc');
AdoQuery.SQL.Add(' RETURN');
AdoQuery.SQL.Add('end');
AdoQuery.SQL.Add('EXEC @hr = sp_OAGetProperty @ListAvailableSQLServers, ''Count'',@Count out');
AdoQuery.SQL.Add('IF @hr <> 0');
AdoQuery.SQL.Add('BEGIN');
AdoQuery.SQL.Add(' EXEC sp_OAGetErrorInfo @ListAvailableSQLServers, @src OUT, @desc OUT');
AdoQuery.SQL.Add(' SELECT hr=convert(varbinary(4),@hr), Source=@src, Description=@desc');
AdoQuery.SQL.Add(' RETURN');
AdoQuery.SQL.Add('END');
AdoQuery.SQL.Add('set @i=1');
AdoQuery.SQL.Add('set @str=''''');
AdoQuery.SQL.Add(' while @i<=@count');
AdoQuery.SQL.Add(' begin');
AdoQuery.SQL.Add(' set @str2=''Item(''+cast(@i as varchar)+'')''');
AdoQuery.SQL.Add(' EXEC @hr = sp_OAGetProperty @ListAvailableSQLServers, @str2,@str2 out');
AdoQuery.SQL.Add(' IF @hr <> 0');
AdoQuery.SQL.Add(' BEGIN');
AdoQuery.SQL.Add(' EXEC sp_OAGetErrorInfo @ListAvailableSQLServers, @src OUT, @desc OUT');
AdoQuery.SQL.Add(' SELECT hr=convert(varbinary(4),@hr), Source=@src, Description=@desc');
AdoQuery.SQL.Add(' break');
AdoQuery.SQL.Add(' END');
AdoQuery.SQL.Add(' if @str=''''');
AdoQuery.SQL.Add(' set @str=@str2');
AdoQuery.SQL.Add(' else');
AdoQuery.SQL.Add(' set @str=@str+'',''+@str2');
AdoQuery.SQL.Add(' set @i=@i+1');
AdoQuery.SQL.Add(' end');
AdoQuery.SQL.Add('exec sp_OADestroy @ListAvailableSQLServers');
AdoQuery.SQL.Add('exec sp_OADestroy @SqlServer');
AdoQuery.SQL.Add(' select @str as A');
AdoQuery.Open;
result:=AdoQuery.Fieldbyname('a').asstring;
end;