获取IP地址

来源:互联网 发布:c语言软件开发 编辑:程序博客网 时间:2024/06/05 17:09

       以下的几种方法是通过网上搜集以及加以整理过后所作的记录!


--通过命令获取,不作解析操作
EXEC xp_cmdshell 'ipconfig'
GO

IF EXISTS (SELECT NAME FROM SYSOBJECTS WHERE NAME = 'SP_GetHostIP' AND OBJECTPROPERTY(ID, 'IsProcedure') = 1 ) 
  DROP PROCEDURE SP_GetHostIP
GO

/******************************************************************************
功能:获取当前数据库所在的IP地址
日期:2013-06-19

--调用示例DECLARE @IP VARCHAR(15)
EXEC SP_GetHostIP @IP OUTPUT
SELECT @IP
******************************************************************************/
CREATE PROC SP_GetHostIP (@IP VARCHAR(15) OUTPUT )
AS 
  DECLARE @CMD VARCHAR(200) ;
  DECLARE @IPTemp TABLE (IPText VARCHAR(255) )

  SET @CMD = 'ping -n 1 ' + HOST_NAME() ;

  INSERT  @IPTemp
  EXEC master..xp_cmdshell @CMD ;

  SELECT  @IP = ISNULL(SUBSTRING(IPText, ( CHARINDEX('[', IPText) + 1 ),
                                 ( CHARINDEX(']', IPText) - ( CHARINDEX('[',
                                                              IPText) + 1 ) )),
                       '')
  FROM    @IPTemp
  WHERE   CHARINDEX('[', IPText) > 0 ;
GO


IF EXISTS (SELECT NAME FROM SYSOBJECTS WHERE NAME = 'SP_GetHostIP' AND OBJECTPROPERTY(ID, 'IsProcedure') = 1 ) 
  DROP PROCEDURE SP_GetHostIP
GO


/******************************************************************************
功能:获取当前数据库所在的IP地址
日期:2013-06-19
备注:此方法不建议使用,耗时相对较长

--调用示例
DECLARE @IP VARCHAR(15)
EXEC SP_GetHostIP @IP OUTPUT
SELECT @IP
******************************************************************************/
CREATE PROC SP_GetHostIP ( @IP VARCHAR(15) OUTPUT )
AS 
BEGIN
  DECLARE @ComputerNameStr VARCHAR(100)
  
  IF OBJECT_ID('##IPTemp') IS NOT NULL 
    DROP TABLE ##IPTemp
   
  CREATE TABLE ##IPTemp (IPText VARCHAR(100)) 
  
  SET @ComputerNameStr = HOST_NAME()
   
  EXEC('INSERT ##IPTemp EXEC master..xp_cmdshell ''ping ' + @ComputerNameStr + '''')  
  SELECT  @IP = STUFF(IPText, 1, CHARINDEX('[', IPText), '')
  FROM    ##IPTemp
  WHERE   LTRIM(IPText) LIKE 'Pinging%'  
  
  SET @IP = LEFT(@IP, CHARINDEX(']', @IP) - 1)  
  DROP   TABLE   ##IPTemp   
END
GO

IF EXISTS (SELECT NAME FROM SYSOBJECTS WHERE ID = OBJECT_ID(N'[dbo].[p_getlinkinfo]') AND OBJECTPROPERTY(ID, N'IsProcedure') = 1) 
  DROP PROCEDURE [dbo].[p_getlinkinfo] 
GO 

/******************************************************************************
--获取连接SQL服务器的信息
所有连接本机的:操作的数据库名,计算机名,用户名,网卡物理地址,IP地址,程序名

--邹建  2003.11(引用请保留此信息)--

--调用示例
--显示所有本机的连接信息
exec p_getlinkinfo 
--显示所有本机的连接信息,包含ip地址
exec p_getlinkinfo @includeip=1 
--显示连接指定数据库的信息
exec p_getlinkinfo 'SY_00_JHWY' 
******************************************************************************/ 
CREATE PROCEDURE p_getlinkinfo
  @dbname SYSNAME = NULL , --要查询的数据库名,默认查询所有数据库的连接信息
  @includeip BIT = 0 --是否显示IP地址,因为查询IP地址比较费时,所以增加此控制
AS 
  DECLARE @dbid INT 
  SET @dbid = DB_ID(@dbname) 

  CREATE   TABLE #tb
    (
      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)
    ) 
  INSERT  INTO #tb
          ( hostname ,
            dbname ,
            net_address ,
            loginname ,
            prog_name
          )
          SELECT   DISTINCT
                  hostname ,
                  DB_NAME(dbid) ,
                  net_address ,
                  loginame ,
                  program_name
          FROM    master..sysprocesses
          WHERE   hostname <> ' '
                  AND ( @dbid IS   NULL
                        OR dbid = @dbid
                      ) 

  IF @includeip = 0 
    GOTO lb_show     --如果不显示IP地址,就直接显示

  DECLARE @sql VARCHAR(500) ,
          @hostname NCHAR(128) ,
          @id INT 
  CREATE TABLE #ip(hostname NCHAR(128), a 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 (a)
    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(a, PATINDEX('%:% ', a) - 1)
  FROM    #tb a
          INNER   JOIN ( SELECT hostname ,
                                a = SUBSTRING(a, 
                                              PATINDEX('Ping statistics for %:%',
                                                       a) + 20, 20)
                         FROM   #ip
                         WHERE  a LIKE 'Ping statistics for %:%'
                       ) b ON a.hostname = b.hostname 

  lb_show: 
  SELECT  id ,
          数据库名 = dbname ,
          客户机名 = hostname ,
          用户名 = loginname ,
          网卡物理地址 = net_address ,
          IP地址 = net_ip ,
          应用程序名称 = prog_name
  FROM    #tb 

GO