Есть ли в SQL Server 2005 запрос, который я могу использовать для получения IP-адреса или имени сервера?
Есть ли в SQL Server 2005 запрос, который я могу использовать для получения IP-адреса или имени сервера?
Ответы:
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 и новее.
Если у вас разрешены соединения с общей памятью, то запуск выше на самом сервере даст вам
<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');
Большинство решений для получения 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-адрес.
Он находится в переменной @@ SERVERNAME ;
SELECT @@SERVERNAME;
- Попробуйте этот сценарий, он подходит для моих нужд. Переформатируйте, чтобы прочитать.
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;
вы можете использовать запрос командной строки и выполнить его в mssql:
exec xp_cmdshell 'ipconfig'
xp_cmdshell
включено в конфигурации безопасности сервера
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
Ad Hoc Distributed Queries
включить.