SQL: consulta para obtener la dirección IP del servidor

95

¿Existe alguna consulta en SQL Server 2005 que pueda utilizar para obtener la IP o el nombre del servidor?

Seibar
fuente
Cuando se conecta a SQL usando un oyente AG, aparece CONNECTIONPROPERTY ('local_net_address') devuelve la IP del oyente en lugar de la IP del servidor.
Brian Beuning

Respuestas:

147
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 

El código aquí le dará la dirección IP;

Esto funcionará para una solicitud de cliente remoto a SQL 2008 y versiones posteriores.

Si tiene conexiones de memoria compartida permitidas, ejecutar arriba en el servidor mismo le dará

  • "Memoria compartida" como valor de 'net_transport', y
  • NULL para 'local_net_address' y
  • ' <local machine>' se mostrará en 'client_net_address'.

'client_net_address' es la dirección de la computadora desde la que se originó la solicitud, mientras que 'local_net_address' sería el servidor SQL (por lo tanto, NULL sobre las conexiones de memoria compartida), y la dirección que le daría a alguien si no puede usar el NetBios del servidor nombre o FQDN por alguna razón.

Aconsejo encarecidamente no usar esta respuesta . Habilitar el shell out es una muy mala idea en un servidor SQL de producción.

Jeff Muzzy
fuente
3
Buena respuesta, excepto que obtengo un número de puerto negativo (-15736) para un puerto que debería ser 49800. Entonces, si es negativo, ¿es seguro agregar simplemente 65536?
crokusek
Si alguien quiere iniciar sesión de forma remota en el servidor SQL de mi computadora, ¿qué IP le doy? local_net_address o client_net_address?
David Blaine
@rene: lo estaba considerando, pero la respuesta original en sí es correcta (para SQL2008 + y conexiones remotas), así que solo pensé en aclarar lo que significaban los parámetros ConnectionProperty. Por supuesto, la respuesta de Chris Leonard (dm_exec_connections) también es correcta, por las mismas razones. Si cree que es mejor que mi apéndice sea una respuesta separada que siéntase libre de hacerlo :) No he respondido las preguntas por un tiempo, por lo que la política y las reglas aquí podrían haber cambiado (las leeré ahora ...)
Martin S. Stoller
Motivo del apéndice según " stackoverflow.com/help/editing ": para aclarar el significado de la publicación (sin cambiar ese significado).
Martin S. Stoller
1
@ MartinS.Stoller He editado su adición para facilitar su lectura. Compruebe si no me he perdido nada.
rene
33

Puede obtener el [nombre de host] \ [nombre de instancia] mediante:

SELECT @@SERVERNAME;

Para obtener solo el nombre de host cuando tiene el formato de nombre de host \ nombre de instancia:

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

Alternativamente, como señaló @GilM:

SELECT SERVERPROPERTY('MachineName')

Puede obtener la dirección IP real usando esto:

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

Fuente del script SQL .

Brian R. Bondy
fuente
19

El servidor puede tener varias direcciones IP en las que está escuchando. Si su conexión tiene el permiso de servidor VIEW SERVER STATE otorgado, puede ejecutar esta consulta para obtener la dirección que se ha conectado a SQL Server:

SELECT dec.local_net_address
FROM sys.dm_exec_connections AS dec
WHERE dec.session_id = @@SPID;

Esta solución no requiere que acceda al sistema operativo a través de xp_cmdshell, que es una técnica que debe deshabilitarse (o al menos asegurarse estrictamente) en un servidor de producción. Es posible que requiera que otorgue VIEW SERVER STATE al inicio de sesión apropiado, pero ese es un riesgo de seguridad mucho menor que ejecutar xp_cmdshell.

La técnica mencionada por GilM para el nombre del servidor es la preferida:

SELECT SERVERPROPERTY(N'MachineName');
skye --- capitán
fuente
Gracias por esta respuesta ... Creo que esta es la verdadera forma de determinar la dirección IP del servidor si necesita verificarla desde el lado de la conexión del cliente, especialmente si la conexión del cliente se estableció con una cadena de conexión que contenía un alias SQL o un nombre instancia como fuente de datos.
Rodolfo G.
11

La mayoría de las soluciones para obtener la dirección IP a través de t-sql se incluyen en estos dos campos:

  1. Ejecutar ipconfig.exea través de xp_cmdshelly analizar la salida

  2. Consultar DMV sys.dm_exec_connections

No soy fanático de la opción # 1. Habilitar xp_cmdshell tiene inconvenientes de seguridad y, de todos modos, hay mucho análisis involucrado. Eso es engorroso. La opción # 2 es elegante. Y es una solución t-sql pura, que casi siempre prefiero. Aquí hay dos consultas de muestra para la opció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 veces, sin embargo, ninguna de las consultas anteriores funciona. La consulta n. ° 1 devuelve NULL si está conectado a través de la memoria compartida (inició sesión y ejecuta SSMS en el host SQL). La consulta n. ° 2 puede no devolver nada si no hay conexiones utilizando un protocolo de memoria no compartida. Este escenario es probable cuando se conecta a una instancia de SQL recién instalada. ¿La solución? Forzar una conexión sobre TCP / IP. Para hacer esto, cree una nueva conexión en SSMS y use el prefijo "tcp:" con el nombre del servidor. Luego, vuelva a ejecutar cualquiera de las consultas y obtendrá la dirección IP.

SSMS: conectarse al motor de base de datos

Dave Mason
fuente
Esto le dará ipv4 ... ¿podemos obtener ipv6?
Shikhil Bhalla
7

puede usar la consulta de línea de comando y ejecutar en mssql:

exec xp_cmdshell 'ipconfig'
Ranjana Ghimire
fuente
1
Eso funcionará solo si xp_cmdshellestá habilitado en la configuración de seguridad del servidor
Javasick
7

--Prueba este script, funciona según mis necesidades. Vuelva a formatear para leerlo.

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;
Hank Freeman
fuente
Gracias. Solo tuve que actualizar dec.local_tcp_port como 'dec.local_tcp_port' para usarlo en una función. De lo contrario, se queja de que hay dos columnas llamadas local_tcp_port.
Steven Van Dorpe
4
select @@servername
Pseudo masoquista
fuente
2

Una forma más sencilla de obtener el nombre de la máquina sin \ InstanceName es:

SELECT SERVERPROPERTY('MachineName')
GilM
fuente
1

Sé que esta es una publicación antigua, pero tal vez esta solución pueda ser útil cuando desee recuperar la dirección IP y el puerto TCP de una conexión de memoria compartida (por ejemplo, de un script ejecutado en SSMS localmente en el servidor). La clave es abrir una conexión secundaria a su SQL Server usando OPENROWSET, en la que especifica 'tcp:' en su cadena de conexión. El resto del código es simplemente construir SQL dinámico para evitar la limitación de OPENROWSET de no poder tomar variables como parámetros.

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
Bert Van Landeghem
fuente
Solo notando que esto requiere Ad Hoc Distributed Queriesestar activado.
Dan