¿Existe alguna consulta en SQL Server 2005 que pueda utilizar para obtener la IP o el nombre del servidor?
Respuestas:
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á
<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.
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
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');
La mayoría de las soluciones para obtener la dirección IP a través de t-sql se incluyen en estos dos campos:
Ejecutar ipconfig.exe
a través de xp_cmdshell
y analizar la salida
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.
Está en la variable @@ SERVERNAME ;
SELECT @@SERVERNAME;
puede usar la consulta de línea de comando y ejecutar en mssql:
exec xp_cmdshell 'ipconfig'
xp_cmdshell
está habilitado en la configuración de seguridad del servidor
--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;
select @@servername
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
Ad Hoc Distributed Queries
estar activado.