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

SQLServer2005中是否有查询可用于获取服务器的 IP 或名称?

391326 次浏览
select @@servername

It's in the @@SERVERNAMEvariable;

SELECT @@SERVERNAME;

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

SQL 脚本的源代码

不使用 InstanceName 获取机器名称的一种更简单的方法是:

SELECT SERVERPROPERTY('MachineName')

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

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

这个解决方案不要求您通过 xp _ cmdshell 向操作系统提供 shell,这种技术应该在生产服务器上禁用(或者至少严格保护)。它可能需要将 VIEWSERVERSTATE 授予适当的登录名,但是这比运行 xp _ cmdshell 的安全风险小得多。

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

SELECT SERVERPROPERTY(N'MachineName');
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及更新版本的远程客户端请求。

If you have Shared Memory connections allowed, then running above on the server itself will give you

  • "Shared Memory" as the value for 'net_transport', and
  • ‘ local _ net _ address’的 NULL,以及
  • <local machine>’将显示在‘ client _ net _ address’中。

“ client _ net _ address”是发出请求的计算机的地址,而“ local _ net _ address”是 SQL 服务器(因此在共享内存连接上为 NULL) ,以及如果某人由于某种原因不能使用服务器的 NetBios 名称或 FQDN,你会给他的地址。

我强烈建议不要使用 这个答案

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

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

  2. 查询车辆管理局 sys.dm_exec_connections

I'm not a fan of option #1. Enabling xp_cmdshell has security drawbacks, and there's lots of parsing involved anyway. That's cumbersome. Option #2 is elegant. And it's a pure t-sql solution, which I almost always prefer. Here are two sample queries for option #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

我知道这是一篇老文章,但是当您想要从共享内存连接(例如从本地服务器上运行的 SSMS 中的脚本)检索 IP 地址和 TCP 端口时,这个解决方案可能会很有用。关键是使用 OPENROWSET 打开到 SQLServer 的辅助连接,其中在连接字符串中指定“ tcp:”。剩下的代码只是构建动态 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

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

exec xp_cmdshell 'ipconfig'

--Try this script it works to my needs. Reformat to read it.

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;

可以使用 host _ name ()函数

select HOST_NAME()

请使用以下查询:

SELECT CONNECTIONPROPERTY('local_net_address') AS [IP]