SQL – Query per ottenere l’indirizzo IP del server

Esiste una query in SQL Server 2005 che posso utilizzare per ottenere l’IP o il nome del server?

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;

Ciò funzionerà per una richiesta client remota a SQL 2008 e versioni successive.

Se si dispone di connessioni di memoria condivisa consentite, l’esecuzione in alto sul server stesso fornirà

  • “Memoria condivisa” come valore per “net_transport” e
  • NULL per ‘local_net_address’, e
  • ‘ verrà mostrato in ‘client_net_address’.

‘client_net_address’ è l’indirizzo del computer da cui è originata la richiesta, mentre ‘local_net_address’ sarebbe il server SQL (quindi NULL su connessioni Shared Memory), e l’indirizzo che si darebbe a qualcuno se non fosse ansible utilizzare il NetBios del server nome o FQDN per qualche motivo.

Consiglio fortemente contro l’utilizzo di questa risposta . Abilitare la shell out è una pessima idea su un server SQL di produzione.

Puoi ottenere [nomehost] \ [nomeistanza] da:

 SELECT @@SERVERNAME; 

Per ottenere solo il nome host quando hai nome host \ formato nome istanza:

 SELECT LEFT(ltrim(rtrim(@@ServerName)), Charindex('\', ltrim(rtrim(@@ServerName))) -1) 

In alternativa, come @GilM ha sottolineato:

 SELECT SERVERPROPERTY('MachineName') 

È ansible 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 

Fonte dello script SQL .

Il server potrebbe avere più indirizzi IP su cui è in ascolto. Se la tua connessione ha il permesso del server VIEW SERVER STATE concesso, puoi eseguire questa query per ottenere l’indirizzo che hai collegato 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 eseguire il shell out del 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 a VIEW SERVER STATE l’accesso appropriato, ma questo è un rischio di sicurezza molto più piccolo rispetto all’esecuzione di xp_cmdshell.

La tecnica menzionata da GilM per il nome del server è quella preferita:

 SELECT SERVERPROPERTY(N'MachineName'); 

La maggior parte delle soluzioni per ottenere l’indirizzo IP via t-sql rientrano in questi due campi:

  1. Eseguire ipconfig.exe tramite xp_cmdshell e analizzare l’output

  2. Query DMV sys.dm_exec_connections

Non sono un fan dell’opzione n. 1. L’abilitazione di xp_cmdshell ha degli svantaggi di sicurezza, e comunque c’è parecchia parsing. È ingombrante. L’opzione n. 2 è elegante. Ed è una soluzione t-sql pura, che preferisco quasi sempre. Ecco 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, nessuna delle query precedenti funziona, però. Query # 1 restituisce NULL se si è connessi tramite Shared Memory (accesso e esecuzione di SSMS sull’host SQL). La query n. 2 potrebbe non restituire nulla se non ci sono connessioni utilizzando un protocollo di memoria non condivisa. Questo scenario è probabile quando connesso a un’istanza SQL appena installata. La soluzione? Forza una connessione su TCP / IP. Per fare ciò, crea una nuova connessione in SSMS e usa il prefisso “tcp:” con il nome del server. Quindi rieseguire la query e otterrai l’indirizzo IP.

SSMS: connessione al motore di database

È nella variabile @ SERVERNAME ;

 SELECT @@SERVERNAME; 

puoi usare la query da riga di comando ed eseguire in mssql:

 exec xp_cmdshell 'ipconfig' 
 select @@servername 

Un modo più semplice per ottenere il nome della macchina senza \ NomeIstanza è:

 SELECT SERVERPROPERTY('MachineName') 

– Prova questo script che funziona secondo i miei bisogni. 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; 

So che questo è un vecchio post, ma forse questa soluzione può essere utile quando si desidera 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 è di aprire una connessione secondaria a SQL Server utilizzando OPENROWSET, in cui si specifica ‘tcp:’ nella stringa di connessione. Il resto del codice sta semplicemente creando SQL dinamico per aggirare la limitazione di OPENROWSET di non essere in grado di prendere le 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