在SQL Server 2005中,是否有一种查询可以用来获取服务器的IP或名称?
在SQL Server 2005中,是否有一种查询可以用来获取服务器的IP或名称?
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及更高版本的远程客户端请求。
如果允许共享内存连接,则在服务器本身上运行以上内容将会给您:
<local machine>
'。'client_net_address'是请求来源计算机的地址,而'local_net_address'则是SQL服务器的地址(因此在共享内存连接上为NULL),如果某些原因不能使用服务器的NetBios名称或FQDN,则应该将其地址提供给其他人。
我强烈建议不要使用这个答案。在生产SQL Server上启用外壳程序是一个非常糟糕的主意。
SELECT @@SERVERNAME;
当你有主机名\实例名称格式时,只需获取主机名:
SELECT LEFT(ltrim(rtrim(@@ServerName)), Charindex('\', ltrim(rtrim(@@ServerName))) -1)
另外,正如@GilM所指出的:
SELECT SERVERPROPERTY('MachineName')
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
服务器可能有多个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');
获取IP地址的T-SQL解决方案大多分为以下两种:
通过xp_cmdshell
运行ipconfig.exe
并解析输出
查询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;
net_transport
= 'Shared memory',而不是 net_transport = 'TCP'
。当您看到这个时,您就知道客户端在 SQL Server 上本身。如果您真的需要 IP 地址,则为 local_net_address
中的值,但请记住,客户端本身并未通过 TCP 连接。 - chris--尝试这个脚本,它符合我的需求。重排以便阅读。
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;
SELECT CONNECTIONPROPERTY('local_net_address') AS [IP]
您可以在 MSSQL 中使用命令行查询和执行:
exec xp_cmdshell 'ipconfig'
xp_cmdshell
,这个才会起作用。 - Javasickselect @@servername
我知道这是一篇旧文章,但也许当你想从共享内存连接中检索IP地址和TCP端口(例如从在服务器本地运行的SSMS脚本)时,这个解决方案可能很有用。关键是使用OPENROWSET打开一个辅助连接到您的SQL Server,在连接字符串中指定“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