SQL – 查询获取服务器的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和更新版本的远程客户端请求。
如果你有共享内存连接允许,那么在服务器本身上面运行会给你
- “共享内存”作为“net_transport”的值
- NULL为'local_net_address',和
- '
<local machine>
'将显示在'client_net_address'中。
'client_net_address'是请求发起的计算机的地址,而'local_net_address'是SQL服务器(因此在共享内存连接上是NULL),如果用户不能使用服务器的NetBios名称或FQDN出于某种原因。
我强烈反对使用这个答案 。 在生产SQL Server上启用shell是一个非常糟糕的主意。
您可以通过以下方式获取[主机名] \ [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脚本的来源 。
服务器可能有多个正在侦听的IP地址。 如果您的连接已授予VIEW SERVER STATE服务器权限,则可以运行此查询以获取已连接到SQL Server的地址:
SELECT dec.local_net_address FROM sys.dm_exec_connections AS dec WHERE dec.session_id = @@SPID;
此解决scheme不要求您通过xp_cmdshell向操作系统发送消息,这是一种应在生产服务器上禁用(或至less严格保护)的技术。 它可能会要求您将VIEW SERVER STATE授予适当的login名,但这比运行xp_cmdshell的安全风险小得多。
GilM提到的服务器名称技术是首选的技术:
SELECT SERVERPROPERTY(N'MachineName');
它位于@@ SERVERNAMEvariables中;
SELECT @@SERVERNAME;
大多数通过t-sql获取IP地址的解决scheme都属于这两个阵营:
-
通过
xp_cmdshell
运行ipconfig.exe
并parsing输出 -
查询DMV
sys.dm_exec_connections
我不是选项#1的粉丝。 启用xp_cmdshell具有安全缺陷,无论如何还有很多parsing。 这很麻烦。 选项#2是优雅的。 这是一个纯粹的t-sql解决scheme,我几乎总是喜欢。 以下是选项#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主机上login并运行SSMS),则查询#1返回NULL。 如果没有使用非共享内存协议的连接,则查询#2可能不会返回任何内容。 连接到新安装的SQL实例时,可能会出现这种情况。 解决scheme? 通过TCP / IP强制连接。 为此,请在SSMS中创build一个新连接,并使用带有服务器名称的“tcp:”前缀。 然后重新运行任何一个查询,你会得到IP地址。
select @@servername
获取没有\ InstanceName的计算机名称的简单方法是:
SELECT SERVERPROPERTY('MachineName')
您可以使用命令行查询并在mssql中执行:
exec xp_cmdshell 'ipconfig'
我知道这是一个旧的post,但是当你想要从共享内存连接(例如从服务器上的本地SSMS中运行的脚本)获取IP地址和TCP端口时,这个解决scheme可能是有用的。 关键是使用OPENROWSET打开到SQL Server的辅助连接,在其中指定连接string中的“tcp:”。 其余的代码只是构builddynamicSQL来解决OPENROWSET的限制,即不能将variables作为参数。
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
– 试试这个脚本,它符合我的需求。 重新格式化阅读。
select
当@@ ServiceName = Right(@@ Servername,len(@@ ServiceName))时,SERVERPROPERTY('ComputerNamePhysicalNetBios')为“Is_Current_Owner”,SERVERPROPERTY('MachineName')为'MachineName',则@@ Servername else @@ servername + '\'+ @@ Servicename以'@@ Servername \ Servicename'结尾,
CONNECTPROPERTY('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 dec WHERE dec.session_id = @@ SPID;