Чи є в 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
Я не фанат варіанту No1. Увімкнення xp_cmdshell має недоліки безпеки, і в будь-якому випадку йде багато аналізу. Це громіздко. Варіант No2 - елегантний. І це чисте рішення 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;
Ви можете використовувати запит командного рядка та виконати в mssql:
exec xp_cmdshell 'ipconfig'
xp_cmdshell
ввімкнено в конфігурації безпеки сервера
- Спробуйте цей сценарій, який працює на мої потреби. Переформатуйте, щоб прочитати його.
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;
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
ввімкнути.