SQL - запрос для получения IP-адреса сервера - PullRequest
74 голосов
/ 27 сентября 2008

Есть ли в SQL Server 2005 запрос, который я могу использовать для получения IP-адреса или имени сервера?

Ответы [ 10 ]

114 голосов
/ 05 февраля 2013
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 и новее.

Если у вас разрешены соединения с Shared Memory, то запуск выше на самом сервере даст вам

  • «Общая память» в качестве значения для «net_transport» и
  • NULL для 'local_net_address' и
  • <local machine> будет отображаться в 'client_net_address'.

«client_net_address» - это адрес компьютера, с которого был получен запрос, тогда как «local_net_address» будет сервером SQL (таким образом, NULL для соединений с общей памятью) и адресом, который вы дадите кому-либо, если он не сможет использовать по какой-либо причине имя NetBios или полное доменное имя сервера.

Я настоятельно рекомендую не использовать этот ответ . Включение оболочки - очень плохая идея для производственного SQL Server.

34 голосов
/ 27 сентября 2008

Вы можете получить [имя_хоста] \ [имя_экземпляра]:

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 .

19 голосов
/ 08 марта 2012

Сервер может иметь несколько 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');
9 голосов
/ 11 ноября 2015

Большинство решений для получения 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 - Connect to Database Engine

8 голосов
/ 27 сентября 2008

В переменной @@ SERVERNAME ;

SELECT @@SERVERNAME;
6 голосов
/ 04 августа 2016

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

exec xp_cmdshell 'ipconfig'
3 голосов
/ 06 ноября 2017

- Попробуйте этот скрипт, он работает для моих нужд. Переформатируйте, чтобы прочитать его.

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;
3 голосов
/ 27 сентября 2008
select @@servername
2 голосов
/ 27 сентября 2008

Более простой способ получить имя машины без \ InstanceName:

SELECT SERVERPROPERTY('MachineName')
0 голосов
/ 24 февраля 2016

Я знаю, что это старый пост, но, возможно, это решение может оказаться полезным, если вы хотите получить 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...