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

Источник сценария SQL.

Сервер может иметь несколько 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 попадают в эти два лагеря:

  1. Бежать ipconfig.exe с помощью xp_cmdshell и разобрать вывод

  2. Запрос 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-адрес.

SSMS - подключение к базе данных Engine

Он находится в переменной @@SERVERNAME;

SELECT @@SERVERNAME;

используйте этот запрос:

      SELECT CONNECTIONPROPERTY('local_net_address') AS [IP]

Вы можете использовать запрос командной строки и выполнить в mssql:

exec xp_cmdshell 'ipconfig'
select @@servername

Я знаю, что это старый пост, но, возможно, это решение может оказаться полезным, если вы хотите получить 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')

Можно использовать функцию host_name()

      select HOST_NAME()

Если экземпляр SQL-сервера находится локально, убедитесь, что у вас есть следующие протоколы:

Если у вас включен протокол SharedMemory:

      SELECT ConnectionProperty('local_net_address') AS 'Server IP Address'

возвращает НУЛЬ

      SELECT ConnectionProperty('client_net_address') AS 'Client IP Address'

возвращает <локальный компьютер>

После отключения SharedMemory и включения TCP/IP эти команды вернут правильный IP-адрес.

Другие вопросы по тегам