在SQL Server 2005中是否有查询可用于获取服务器的IP或名称?SQL - 查询获取服务器的IP地址
回答
select @@servername
它在@@SERVERNAME变量中;
SELECT @@SERVERNAME;
你可以得到[主机名] \ [实例]由:
SELECT LEFT(ltrim(rtrim(@@ServerName)), Charindex('\', ltrim(rtrim(@@ServerName))) -1)
或者为:
SELECT @@SERVERNAME;
要当你的主机名\实例名称格式只得到主机名@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
更简单的方法来获取机器名,不带\实例是:
SELECT SERVERPROPERTY('MachineName')
服务器可能有多个IP地址,它正在监听。如果您的连接已授予其查看服务器状态服务器许可,您可以运行此查询来获取您连接到SQL Server地址:
SELECT dec.local_net_address
FROM sys.dm_exec_connections AS dec
WHERE dec.session_id = @@SPID;
此解决方案不要求你通过掏出来的OS xp_cmdshell,这是一种应在生产服务器上禁用(或至少严格保护)的技术。它可能会要求您将VIEW SERVER STATE授予适当的登录名,但这比运行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地址;
这将适用于SQL 2008及更新版本的远程客户端请求。
如果您共享内存连接允许,然后在服务器上面运行本身会给你
- “共享内存”作为“net_transport”的价值,并为“local_net_address”
- NULL,和
- '
<local machine>
'将显示在'client_net_address'中。
“client_net_address”是该请求源自计算机的地址,而“local_net_address”将是SQL服务器(从而通过共享内存的连接NULL),地址你会给别人,如果他们能出于某种原因,不使用服务器的NetBIOS名称或FQDN。
我强烈反对使用this answer。在生产SQL Server上启用外壳是一个非常糟糕的主意。
除了我得到一个负端口号(-15736)对于一个应该是49800的端口,这是一个很好的答案。所以如果负数是安全的,只需添加65536? – crokusek 2013-03-28 22:50:24
如果有人想远程登录到我的电脑的SQL服务器,那么我应该给他哪个IP? local_net_address或client_net_address? – 2013-05-08 21:27:30
用于获得通过T-SQL秋天的IP地址为这两个阵营大多数解决方案:
通过
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;
虽然有时候,上述查询都不起作用。如果通过共享内存连接(在SQL主机上登录并运行SSMS),则查询#1返回NULL。如果没有使用非共享内存协议的连接,则查询#2可能不会返回任何内容。连接到新安装的SQL实例时,可能会出现这种情况。解决方案?通过TCP/IP强制连接。为此,请在SSMS中创建一个新连接,并使用带有服务器名称的“tcp:”前缀。然后重新运行任一查询,您将获得IP地址。
我知道这是一个古老的职位,但也许当你想要从一个共享内存连接(例如从SSMS上本地运行的脚本的IP地址和TCP端口此解决方案可以是有用服务器)。关键是使用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
您可以使用命令行查询,并在MSSQL执行:
exec xp_cmdshell 'ipconfig'
--Try这个脚本它的作品我的需要。重新格式化以读取它。
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;
- 1. 获取服务器IP地址
- 2. 获取IP地址当前服务器
- 3. 如何获取服务器IP地址?
- 4. 如何从SQL Server 2005中查询服务器的IP地址?
- 5. 查找服务器的IP地址
- 6. 服务器的IP地址
- 7. 在服务器端获取本地IP地址的非服务器端方法?
- 8. DNS服务器IP地址
- 9. tcp服务器ip地址
- 10. 如何获取getaddrinfo查询的DNS服务器的地址
- 11. 如何从IP地址获取服务器的机器名称?
- 12. 如何获取响应WebResponse的服务器的IP地址C#
- 13. 如何获取请求来自的服务器的IP地址?
- 14. 从服务器获取客户端的IP地址
- 15. 获取WCF中的服务器IP地址?
- 16. 获取域的IP地址和后端服务器信息
- 17. 如何在.NET中获取服务器的IP地址?
- 18. 如何获取asp.net中的服务器/网站IP地址?
- 19. node.js http(s):获取远程服务器的IP地址
- 20. 如何在rails上获取主机服务器的IP地址
- 21. 在PHP中获取服务器的主机名或IP地址
- 22. ASP.NET - 获取服务器本地IP
- 23. Spring集成TCP服务器:获取IP地址和负载
- 24. 在centos中获取ldap服务器IP地址和端口号
- 25. 从JSP请求/会话对象获取服务器IP地址
- 26. 从主机名获取服务器IP地址
- 27. CSocket服务器获取客户端IP地址
- 28. 在无连接服务器上获取远程IP地址
- 29. 获取IP地址
- 30. 获取IP地址
感谢这个反应......我认为这是确定服务器的IP地址的正确的方法,如果你需要从客户端的连接端验证,特别是如果有一个连接字符串建立了客户端的连接是包含一个SQL别名或命名实例作为数据源。 – 2012-04-12 21:09:28
upvoted表示不仅仅是为了阻止xp_cmdshell,而是为了确保严格保护 – SheldonH 2015-12-16 17:52:35