Подтвердить что ты не робот

SQL - запрос для получения IP-адреса сервера

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

4b9b3361

Ответ 1

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.

Ответ 2

Вы можете получить имя [hostname]\[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 script.

Ответ 3

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

Предпочтительная технология, упомянутая GilM для имени сервера:

SELECT SERVERPROPERTY(N'MachineName');

Ответ 4

Он в переменной @@SERVERNAME;

SELECT @@SERVERNAME;

Ответ 5

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

SSMS - Подключиться к движку базы данных

Ответ 6

select @@servername

Ответ 7

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

SELECT SERVERPROPERTY('MachineName')

Ответ 8

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

exec xp_cmdshell 'ipconfig'

Ответ 9

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

SELECT
SERVERPROPERTY ('ComputerNamePhysicalNetBios') как 'Is_Current_Owner'   , SERVERPROPERTY ('MachineName') как 'MachineName'   , случай, когда @@ServiceName =   Right (@@Servername, len (@@ServiceName)), а затем @@Servername     else @@servername + '\' + @@Servicename     end как '@@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 как 'dec.local_net_address'   FROM sys.dm_exec_connections AS dec   WHERE dec.session_id = @@SPID;

Ответ 10

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