代码之家  ›  专栏  ›  技术社区  ›  Seibar

SQL-查询以获取服务器的IP地址

  •  69
  • Seibar  · 技术社区  · 16 年前

    在SQLServer2005中是否有一个查询可以用来获取服务器的IP或名称?

    10 回复  |  直到 16 年前
        1
  •  156
  •   Community Lee Campbell    7 年前
    SELECT  
       CONNECTIONPROPERTY('net_transport') AS net_transport,
       CONNECTIONPROPERTY('protocol_type') AS protocol_type,
       CONNECTIONPROPERTY('auth_scheme') AS auth_scheme,
       CONNECTIONPROPERTY('local_net_address') AS local_net_address,
       CONNECTIONPROPERTY('local_tcp_port') AS local_tcp_port,
       CONNECTIONPROPERTY('client_net_address') AS client_net_address 
    

    这里的代码将为您提供IP地址;

    这将适用于对SQL2008和更新版本的远程客户端请求。

    如果您允许共享内存连接,那么在服务器本身上运行上面的命令

    • “共享内存”作为“网络传输”的值,以及
    • “local\u net\u address”为空,并且
    • ' <local machine>

    “client\u net\u address”是发出请求的计算机的地址,而“local\u net\u address”则是SQL server(因此在共享内存连接上为空),如果某人由于某种原因无法使用服务器的NetBios名称或FQDN,则您将为其提供地址。

    this answer . 在生产SQL Server上启用shell输出是一个非常糟糕的主意。

        2
  •  35
  •   Brian R. Bondy    16 年前

    您可以通过以下方式获取[hostname]\[instancename]:

    SELECT @@SERVERNAME;
    

    要在使用hostname\instance name格式时仅获取主机名,请执行以下操作:

    SELECT LEFT(ltrim(rtrim(@@ServerName)), Charindex('\', ltrim(rtrim(@@ServerName))) -1)
    

    或者,正如@GilM所指出的:

    SELECT SERVERPROPERTY('MachineName')
    

    您可以使用以下命令获取实际IP地址:

    create Procedure sp_get_ip_address (@ip varchar(40) out)
    as
    begin
    Declare @ipLine varchar(200)
    Declare @pos int
    set nocount on
              set @ip = NULL
              Create table #temp (ipLine varchar(200))
              Insert #temp exec master..xp_cmdshell 'ipconfig'
              select @ipLine = ipLine
              from #temp
              where upper (ipLine) like '%IP ADDRESS%'
              if (isnull (@ipLine,'***') != '***')
              begin 
                    set @pos = CharIndex (':',@ipLine,1);
                    set @ip = rtrim(ltrim(substring (@ipLine , 
                   @pos + 1 ,
                    len (@ipLine) - @pos)))
               end 
    drop table #temp
    set nocount off
    end 
    go
    
    declare @ip varchar(40)
    exec sp_get_ip_address @ip out
    print @ip
    

    Source of the SQL script

        3
  •  21
  •   chris    12 年前

    服务器可能有多个它正在侦听的IP地址。如果您的连接已被授予“查看服务器状态服务器”权限,则可以运行此查询以获取已连接到SQL SERVER的地址:

    SELECT dec.local_net_address
    FROM sys.dm_exec_connections AS dec
    WHERE dec.session_id = @@SPID;
    

    此解决方案不需要您通过xp\u cmdshell向外发布到操作系统,这是一种应该在生产服务器上禁用(或至少严格保护)的技术。它可能要求您将视图服务器状态授予相应的登录名,但这比运行xp\u cmdshell的安全风险要小得多。

    SELECT SERVERPROPERTY(N'MachineName');
    
        4
  •  11
  •   Dave Mason    9 年前

    大多数通过t-sql获取IP地址的解决方案分为以下两个阵营:

    1. ipconfig.exe 通过 xp_cmdshell

    2. sys.dm_exec_connections

    我不喜欢选项1。启用xp\u cmdshell有安全缺陷,而且需要进行大量解析。那太麻烦了。选项2非常优雅。而且它是一个纯t-sql解决方案,我几乎总是更喜欢它。下面是选项2的两个示例查询:

    SELECT c.local_net_address
    FROM sys.dm_exec_connections AS c
    WHERE c.session_id = @@SPID;
    
    SELECT TOP(1) c.local_net_address
    FROM sys.dm_exec_connections AS c
    WHERE c.local_net_address IS NOT NULL;
    

    不过,有时上述两种查询都不起作用。如果通过共享内存连接(在SQL主机上登录并运行SSMS),查询#1将返回NULL。如果没有使用非共享内存协议的连接,查询#2可能不返回任何内容。当连接到新安装的SQL实例时,可能会出现这种情况。解决方案是什么?通过TCP/IP强制连接。为此,请在SSMS中创建一个新连接,并在服务器名称中使用“tcp:”前缀。然后重新运行任一查询,您将获得IP地址。

    SSMS - Connect to Database Engine

        5
  •  8
  •   Seibar    16 年前

    在房间里 @@SERVERNAME 变量;

    SELECT @@SERVERNAME;
    
        6
  •  8
  •   Marco Souza Hank Freeman    7 年前

    --试试这个剧本,它适合我的需要。重新格式化以阅读它。

    SELECT  
    SERVERPROPERTY('ComputerNamePhysicalNetBios')  as 'Is_Current_Owner'
        ,SERVERPROPERTY('MachineName')  as 'MachineName'
        ,case when @@ServiceName = 
        Right (@@Servername,len(@@ServiceName)) then @@Servername 
          else @@servername +' \ ' + @@Servicename
          end as '@@Servername \ Servicename',  
        CONNECTIONPROPERTY('net_transport') AS net_transport,
        CONNECTIONPROPERTY('local_tcp_port') AS local_tcp_port,
        dec.local_tcp_port,
        CONNECTIONPROPERTY('local_net_address') AS local_net_address,
        dec.local_net_address as 'dec.local_net_address'
        FROM sys.dm_exec_connections AS dec
        WHERE dec.session_id = @@SPID;
    
        7
  •  7
  •   Ranjana Ghimire    8 年前

    您可以使用命令行查询并在mssql中执行:

    exec xp_cmdshell 'ipconfig'
    
        8
  •  4
  •   Seibar    16 年前
    select @@servername
    
        9
  •  2
  •   GilM    16 年前

    不使用\InstanceName获取计算机名的更简单方法是:

    SELECT SERVERPROPERTY('MachineName')
    
        10
  •  1
  •   Greg Sansom    8 年前

    DECLARE @ip_address       varchar(15)
    DECLARE @tcp_port         int 
    DECLARE @connectionstring nvarchar(max) 
    DECLARE @parm_definition  nvarchar(max)
    DECLARE @command          nvarchar(max)
    
    SET @connectionstring = N'Server=tcp:' + @@SERVERNAME + ';Trusted_Connection=yes;'
    SET @parm_definition  = N'@ip_address_OUT varchar(15) OUTPUT
                            , @tcp_port_OUT   int         OUTPUT';
    
    SET @command          = N'SELECT  @ip_address_OUT = a.local_net_address,
                                      @tcp_port_OUT   = a.local_tcp_port
                              FROM OPENROWSET(''SQLNCLI''
                                     , ''' + @connectionstring + '''
                                     , ''SELECT local_net_address
                                              , local_tcp_port
                                         FROM sys.dm_exec_connections
                                         WHERE session_id = @@spid
                                       '') as a'
    
    EXEC SP_executeSQL @command
                     , @parm_definition
                     , @ip_address_OUT = @ip_address OUTPUT
                     , @tcp_port_OUT   = @tcp_port OUTPUT;
    
    
    SELECT @ip_address, @tcp_port
    
        11
  •  0
  •   Eralper    4 年前

    可以使用host\u name()函数

    select HOST_NAME()
    
        12
  •  0
  •   گلی    3 年前

    请使用此查询:

    SELECT CONNECTIONPROPERTY('local_net_address') AS [IP]