Есть ли запрос в SQL Server 2005, который я могу использовать для получения IP-адреса или имени сервера?
SQL - запрос для получения IP-адреса сервера
Ответ 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
Ответ 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-адрес.
Ответ 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