当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《SQL-查询以获取服务器的IP地址》经验,为你挑选了6个好方法。

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



1> 小智..:
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'为NULL,和

' '将显示在'client_net_address'中.

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

我建议强烈反对使用这个答案.在生产SQL Server上启用shell是一个非常糟糕的主意.


很好的答案,除了我得到的端口号应该为49800的端口号为负(-15736)。因此,如果为负数,只需添加65536是否安全?

2> Brian R. Bon..:

您可以通过以下方式获取[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

SQL脚本的来源.



3> 小智..:

服务器可能有多个正在侦听的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');



4> Dave Mason..:

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

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

    查询DMV sys.dm_exec_connections

我不是选项#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中创建新连接,并将"tcp:"前缀与服务器名称一起使用.然后重新运行任一查询,您将获得IP地址.

SSMS  - 连接到数据库引擎



5> Michał Piask..:

它位于@@ SERVERNAME变量中;

SELECT @@SERVERNAME;



6> 小智..:

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

exec xp_cmdshell 'ipconfig'

推荐阅读
大大炮
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有