-- =============================================
-- Author: <lisky>
-- Create date: <2010-09-10>
-- Description: <查看连接到SQL Server数据库的用户信息>
-- =============================================
ALTER PROCEDURE [dbo].[SMC_GetDBConnectionsInfo]
@DatabaseName sysname=NULL, --参数1:要查询的数据库名称,默认查询所有数据库的连接信息
@ShowIPAddress bit=0 --参数2:是否显示IP地址,默认为否(查询IP地址比较费时,但必须启用 'xp_cmdshell' 组件)
AS
SET Transaction Isolation Level Read UNCOMMITTED
SET NOCOUNT ON
DECLARE @DatabaseID int
SET @DatabaseID=db_id(@DatabaseName)
Create TABLE #tblTemp(ID int identity(1,1),
DatabaseName sysname,
HostName nchar(128),
UserName nchar(128),
MACAddress nchar(12),
IPAddress nchar(15),
Application nchar(128))
Insert INTO #tblTemp(HostName,DatabaseName,MACAddress,UserName,Application)
Select DISTINCT hostname,db_name(dbid),net_address,loginame,program_name
FROM master..sysprocesses
Where hostname<>'' AND (@DatabaseID IS NULL or dbid=@DatabaseID)
IF @ShowIPAddress=0 GOTO Tag_ShowIPAddress
DECLARE @SQLStatement varchar(500),@HostName nchar(128),@ID int
Create TABLE #tblIP(HostName nchar(128),
TempString varchar(200))
DECLARE tblTemp CURSOR LOCAL FOR Select DISTINCT HostName FROM #tblTemp
OPEN tblTemp
FETCH NEXT FROM tblTemp INTO @HostName
WHILE @@FETCH_STATUS=0
BEGIN
SET @SQLStatement='ping '+@HostName+' -a -n 1 -l 1'
Insert #tblIP(TempString) EXEC master..xp_cmdshell @SQLStatement
Update #tblIP SET HostName=@HostName Where HostName IS NULL
FETCH NEXT FROM tblTemp INTO @HostName
END
Update #tblTemp SET IPAddress=LEFT(TempString,PATINDEX('%:%',TempString)-1)
FROM #tblTemp X INNER JOIN ( Select HostName,TempString=SUBSTRING(TempString,PATINDEX('ping statistics for %:%',TempString)+20,20)
FROM #tblIP
Where TempString LIKE'ping statistics for %:%') Y
ON X.HostName=Y.HostName
Tag_ShowIPAddress:
Select 序号=ID,数据库名称=DatabaseName,客户机名称=RTRIM(HostName),用户名=RTRIM(UserName),
MAC地址=MACAddress,IP地址=IPAddress,应用程序名称=RTRIM(Application)
FROM #tblTemp