¿Hay una consulta en SQL Server 2005 que pueda usar para obtener la IP o nombre del servidor?
Respuestas
¿Demasiados anuncios?SELECCIONAR
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í te dará la dirección IP;
Esto funcionará para una solicitud de cliente remoto a SQL 2008 y versiones más nuevas.
Si tienes permitidas las conexiones de Memoria Compartida, entonces al ejecutar lo anterior en el propio servidor te dará
- "Memoria Compartida" como el valor para 'net_transport', y
- NULL para 'local_net_address', y
- '' 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 en conexiones de Memoria Compartida), y la dirección que darías a alguien si no pudiera usar el nombre de NetBios o FQDN del servidor por alguna razón.
Recomiendo firmemente no usar esta respuesta. Habilitar la ejecución de shell es una idea muy mala en un servidor SQL en producción.
Puedes obtener el[hostname]\[instancename] de la siguiente manera:
SELECT @@SERVERNAME;
Para obtener solo el nombre de host cuando tienes el formato nombre de host\nombre de instancia:
SELECT LEFT(ltrim(rtrim(@@ServerName)), Charindex('\', ltrim(rtrim(@@ServerName))) -1)
Alternativamente como señaló @GilM:
SELECT SERVERPROPERTY('MachineName')
Puedes obtener la dirección IP actual utilizando lo siguiente:
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
El servidor puede tener múltiples direcciones IP en las que está escuchando. Si tu conexión tiene el permiso del servidor VIEW SERVER STATE, puedes ejecutar esta consulta para obtener la dirección a la que te has conectado al servidor SQL:
SELECT dec.local_net_address
FROM sys.dm_exec_connections AS dec
WHERE dec.session_id = @@SPID;
Esta solución no requiere que recurras al sistema operativo a través de xp_cmdshell, lo cual es una técnica que debería deshabilitarse (o al menos estar estrictamente asegurada) en un servidor de producción. Puede que necesites conceder el permiso VIEW SERVER STATE al inicio de sesión correspondiente, pero 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');
Está en la variable @@SERVERNAME ;
SELECT @@SERVERNAME;