原贴见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
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
函数里不能用execute
这句有问题,向表变量插入的时候不能使用这样的形式
insert @temptable exec 存储过程所以把表变量换成普通的表
换成
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,换成你喜欢的名字也可以
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),不能使用临时表