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

时间:2008-09-26 21:37:17

标签: sql sql-server

我是否可以使用SQL Server 2005中的查询来获取服务器的IP或名称?

12 个答案:

答案 0 :(得分:113)

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地址;

这适用于SQL 2008及更高版本的远程客户端请求。

如果您允许共享内存连接,那么在服务器上运行上面将为您提供

  • “共享内存”作为“net_transport”和
  • 的值
  • “local_net_address”为空,
  • '<local machine>'将显示在'client_net_address'中。

'client_net_address'是请求来自的计算机的地址,而'local_net_address'将是SQL服务器(因此在共享内存连接上为NULL),以及如果他们无法使用,您将提供给他人的地址由于某种原因,服务器的NetBios名称或FQDN。

我建议强烈反对使用this answer。在生产SQL Server上启用shell是一个非常糟糕的主意。

答案 1 :(得分:34)

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

SELECT @@SERVERNAME;

当您拥有主机名\实例名称格式时,仅获取主机名:

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

答案 2 :(得分:19)

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

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

此解决方案不要求您通过xp_cmdshell对操作系统进行外壳操作,这是一种应该在生产服务器上禁用(或至少严格保护)的技术。可能需要您将VIEW SERVER STATE授予适当的登录名,但这比运行xp_cmdshell的安全风险要小得多。

GilM提到的服务器名称技术是首选的技术:

SELECT SERVERPROPERTY(N'MachineName');

答案 3 :(得分:9)

通过t-sql获取IP地址的大多数解决方案都属于这两个阵营:

  1. 通过ipconfig.exe运行xp_cmdshell并解析输出

  2. 查询DMV sys.dm_exec_connections

  3. 我不是选项#1的粉丝。启用xp_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中创建一个新连接并使用&#34; tcp:&#34;前缀与服务器名称。然后重新运行任一查询,您将获得IP地址。

    SSMS - Connect to Database Engine

答案 4 :(得分:8)

它在@@SERVERNAME 变量中;

SELECT @@SERVERNAME;

答案 5 :(得分:6)

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

exec xp_cmdshell 'ipconfig'

答案 6 :(得分:3)

select @@servername

答案 7 :(得分:3)

- 试试这个脚本它可以满足我的需求。重新格式化以阅读它。

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;

答案 8 :(得分:2)

在没有\ InstanceName的情况下获取计算机名称的简单方法是:

SELECT SERVERPROPERTY('MachineName')

答案 9 :(得分:1)

请使用此查询:

SELECT CONNECTIONPROPERTY('local_net_address') AS [IP]

答案 10 :(得分:0)

我知道这是一篇旧帖子,但是当你想从共享内存连接中检索IP地址和TCP端口时(例如,从服务器本地SSMS运行的脚本),这个解决方案可能很有用。关键是使用OPENROWSET打开与SQL Server的辅助连接,在其中指定&#39; tcp:&#39;在你的连接字符串中。其余的代码只是构建动态SQL来解决OPENROWSET无法将变量作为参数的限制。

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)

可以使用host_name()函数

select HOST_NAME()