SQL - запрос для получения IP-адреса сервера
Есть ли в SQL Server 2005 запрос, который я могу использовать для получения IP-адреса или имени сервера?
13 ответов
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 сервера. имя или полное доменное имя по какой-то причине.
Я настоятельно советую не использовать этот ответ. Включение оболочки - очень плохая идея на производственном SQL Server.
Вы можете получить [имя хоста]\[имя экземпляра]:
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
Сервер может иметь несколько 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');
- Попробуйте этот скрипт, он работает для моих нужд. Переформатируйте, чтобы прочитать это.
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;
Большинство решений для получения IP-адреса через t-sql попадают в эти два лагеря:
Бежать
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;
Иногда, ни один из вышеупомянутых запросов не работает, хотя. Запрос № 1 возвращает NULL, если вы подключены через общую память (вошли в систему и запустили SSMS на хосте SQL). Запрос № 2 может ничего не возвращать, если нет соединений, использующих протокол без общей памяти. Этот сценарий вероятен при подключении к недавно установленному экземпляру SQL. Решение? Принудительно установить соединение через TCP/IP. Для этого создайте новое соединение в SSMS и используйте префикс "tcp:" с именем сервера. Затем повторно запустите любой запрос, и вы получите IP-адрес.
используйте этот запрос:
SELECT CONNECTIONPROPERTY('local_net_address') AS [IP]
Вы можете использовать запрос командной строки и выполнить в mssql:
exec xp_cmdshell 'ipconfig'
Я знаю, что это старый пост, но, возможно, это решение может оказаться полезным, если вы хотите получить IP-адрес и порт TCP из соединения с общей памятью (например, из сценария, выполняемого в SSMS локально на сервере). Ключ заключается в том, чтобы открыть вторичное соединение с вашим SQL Server с помощью OPENROWSET, в котором вы указываете "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
Более простой способ получить имя машины без \InstanceName:
SELECT SERVERPROPERTY('MachineName')
Если экземпляр SQL-сервера находится локально, убедитесь, что у вас есть следующие протоколы:
Если у вас включен протокол SharedMemory:
SELECT ConnectionProperty('local_net_address') AS 'Server IP Address'
возвращает НУЛЬ
SELECT ConnectionProperty('client_net_address') AS 'Client IP Address'
возвращает <локальный компьютер>
После отключения SharedMemory и включения TCP/IP эти команды вернут правильный IP-адрес.