C'è una query in SQL Server 2005 che posso utilizzare per ottenere l'IP o il nome del server?
Risposte:
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
Il codice qui ti darà l'indirizzo IP;
Funzionerà per una richiesta del client remoto a SQL 2008 e versioni successive.
Se sono consentite le connessioni di memoria condivisa, allora in esecuzione sopra sul server stesso ti darà
<local machine>
" verrà visualizzato in "client_net_address".'client_net_address' è l'indirizzo del computer da cui ha avuto origine la richiesta, mentre 'local_net_address' sarebbe il server SQL (quindi NULL sulle connessioni di memoria condivisa) e l'indirizzo che daresti a qualcuno se non può usare NetBios del server nome o FQDN per qualche motivo.
Consiglio vivamente di non usare questa risposta . Abilitare la shell è una pessima idea su uno SQL Server di produzione.
Puoi ottenere [hostname] \ [instancename] tramite:
SELECT @@SERVERNAME;
Per ottenere solo il nome host quando hai il formato nome host \ nome istanza:
SELECT LEFT(ltrim(rtrim(@@ServerName)), Charindex('\', ltrim(rtrim(@@ServerName))) -1)
In alternativa, come ha sottolineato @GilM:
SELECT SERVERPROPERTY('MachineName')
Puoi ottenere l'indirizzo IP effettivo usando questo:
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
Il server potrebbe avere più indirizzi IP su cui è in ascolto. Se la connessione dispone dell'autorizzazione del server VIEW SERVER STATE concessa, è possibile eseguire questa query per ottenere l'indirizzo a cui si è connessi a SQL Server:
SELECT dec.local_net_address
FROM sys.dm_exec_connections AS dec
WHERE dec.session_id = @@SPID;
Questa soluzione non richiede di sborsare nel sistema operativo tramite xp_cmdshell, che è una tecnica che dovrebbe essere disabilitata (o almeno strettamente protetta) su un server di produzione. Potrebbe essere necessario concedere VIEW SERVER STATE all'accesso appropriato, ma questo è un rischio per la sicurezza molto inferiore rispetto all'esecuzione di xp_cmdshell.
La tecnica citata da GilM per il nome del server è quella preferita:
SELECT SERVERPROPERTY(N'MachineName');
La maggior parte delle soluzioni per ottenere l'indirizzo IP tramite t-sql rientrano in questi due campi:
Esegui ipconfig.exe
tramite xp_cmdshell
e analizza l'output
Query DMV sys.dm_exec_connections
Non sono un fan dell'opzione n. 1. L'abilitazione di xp_cmdshell presenta degli svantaggi di sicurezza e comunque sono coinvolte molte analisi. È ingombrante. L'opzione n. 2 è elegante. Ed è una pura soluzione t-sql, che preferisco quasi sempre. Di seguito sono riportate due query di esempio per l'opzione n. 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;
A volte, però, nessuna delle query precedenti funziona. La query n. 1 restituisce NULL se sei connesso tramite Shared Memory (connesso ed eseguendo SSMS sull'host SQL). La query n. 2 potrebbe non restituire nulla se non ci sono connessioni che utilizzano un protocollo di memoria non condivisa. Questo scenario è probabile quando ci si connette a un'istanza SQL appena installata. La soluzione? Forza una connessione su TCP / IP. A tale scopo, creare una nuova connessione in SSMS e utilizzare il prefisso "tcp:" con il nome del server. Quindi riesegui una delle query e otterrai l'indirizzo IP.
È nella variabile @@ SERVERNAME ;
SELECT @@SERVERNAME;
puoi usare la query della riga di comando ed eseguire in mssql:
exec xp_cmdshell 'ipconfig'
xp_cmdshell
- Prova questo script che funziona secondo le mie esigenze. Riformatta per leggerlo.
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
So che questo è un vecchio post, ma forse questa soluzione può essere utile quando vuoi recuperare l'indirizzo IP e la porta TCP da una connessione di memoria condivisa (ad esempio da uno script eseguito in SSMS localmente sul server). La chiave è aprire una connessione secondaria a SQL Server utilizzando OPENROWSET, in cui specificare "tcp:" nella stringa di connessione. Il resto del codice sta semplicemente costruendo SQL dinamico per aggirare il limite di OPENROWSET di non essere in grado di prendere variabili come parametri.
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
di essere attivato.