原贴见http://community.csdn.net/Expert/topic/5050/5050466.xml?temp=.3775751
create function funUserList( @dbname sysname=null, /*要查询的数据库名,默认查询所有数据库的连接信息*/ 
@includeip bit=0) /*是否显示IP地址,因为查询IP地址比较费时,所以增加此控制*/ 
returns @tb table(id int identity(1,1),dbname sysname,hostname nchar(128),loginname nchar(128),
net_address nchar(12),net_ip nvarchar(15),prog_name nchar(128),login_time nvarchar(24),last_batch nvarchar(24)) 
as 
begin 
declare @dbid int set @dbid=db_id(@dbname) declare @tb_ table(id   int   identity(1,1),dbname   sysname,hostname   nchar(128),loginname   nchar(128),net_address   nchar(12),net_ip   nvarchar(15),prog_name   nchar(128),login_time nvarchar(24),last_batch nvarchar(24)) insert into tb_(hostname,dbname,net_address,loginname,prog_name,login_time,last_batch) 
select distinct hostname,db_name(dbid),net_address,loginame,program_name,convert(varchar,login_time,120),convert(varchar,last_batch,120) from master..sysprocesses 
where hostname<>'' and (@dbid is null or dbid=@dbid) and status <>'background' 
if @includeip=0 
goto lb_show /*如果不显示IP地址,就直接显示*/ 
declare @sql varchar(500),@hostname nchar(128) 
declare @ip table(hostname nchar(128),f varchar(200)) 
declare tb cursor local for select distinct hostname from @tb_ 
open tb fetch next from tb into @hostname 
while @@fetch_status=0 
begin   
set @sql='ping '+@hostname+' -a -n 1 -l 1'   insert @ip(f) exec master..xp_cmdshell @sql
update @ip set hostname=@hostname where hostname is null   
fetch next from tb into @hostname 
end update @tb set net_ip=left(f,patindex('%:%',f)-1) from @tb a inner join 
( select hostname,f=substring(f,patindex('Ping statistics for %:%',f)+20,20) from @ip 
where f like 'Ping statistics for %:%') b on a.hostname=b.hostname lb_show: insert into @tb(id,dbname,hostname,loginname,net_address,net_ip,prog_name,login_time,last_batch) select   id,
数据库名=dbname,客户机名=hostname,用户名=loginname ,网卡物理地址=net_address,IP地址=net_ip,应用程序名称=prog_name,login_time,last_batch   
from  @tb_ return end 

解决方案 »

  1.   

    没有办法
    函数里不能用execute
      

  2.   

    不能转换成函数,函数中不能使用扩展存储过程master..xp_cmdshell 。
      

  3.   

    不能转换成函数,可以使用扩展存储过程master..xp_cmdshell,但不能使用临时表。
      

  4.   

    insert @ip(f) exec master..xp_cmdshell @sql
    这句有问题,向表变量插入的时候不能使用这样的形式
    insert @temptable exec 存储过程所以把表变量换成普通的表
      

  5.   

    -- declare @ip table(hostname nchar(128),f varchar(200)) 
    换成
    create table ip(hostname nchar(128),f varchar(200)) 
    然后把其他使用到的表变量@ip换成 ip-- 方法2
    在数据中建一个表 create table ip(hostname nchar(128),f varchar(200)) 
    然后在函数开头 使用之前先清空它  delete from ip
     
    当然这个表的名字也不可以为ip,换成你喜欢的名字也可以
      

  6.   

    >1
    create function fun_test()
    returns int
    as 
    begin
       declare @i int
       EXEC ('USE pubs')
       return(@i)
    end
    服务器: 消息 443,级别 16,状态 2,过程 fun_test,行 6
    在函数内不正确地使用了 'EXECUTE'。
    >2
    create function fun_test()
    returns int
    as 
    begin
       declare @i int
       EXECUTE master..xp_cmdshell 'dir *.exe'
       return(@i)
    endselect dbo.fun_test()
    /*
    返回值
    NULL
    */
    >3
    create function fun_test()
    returns int
    as 
    begin
       declare @i int
       create table #tb(a int)
       return(@i)
    end服务器: 消息 2772,级别 16,状态 1,过程 fun_test,行 6
    无法从函数中访问临时表。----------
    小结:
    函数中不能使用exec(execute),不能使用临时表