Existe-t-il une requête dans SQL Server 2005 que je peux utiliser pour obtenir l'adresse IP ou le nom du serveur?
Existe-t-il une requête dans SQL Server 2005 que je peux utiliser pour obtenir l'adresse IP ou le nom du serveur?
Réponses:
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
Le code ici vous donnera l'adresse IP;
Cela fonctionnera pour une demande de client distant vers SQL 2008 et plus récent.
Si les connexions de mémoire partagée sont autorisées, l'exécution ci-dessus sur le serveur lui-même vous donnera
<local machine>
» sera affiché dans «client_net_address».'client_net_address' est l'adresse de l'ordinateur d'où provient la demande, tandis que 'local_net_address' serait le serveur SQL (donc NULL sur les connexions de mémoire partagée), et l'adresse que vous donneriez à quelqu'un s'il ne peut pas utiliser les NetBios du serveur nom ou FQDN pour une raison quelconque.
Je déconseille fortement d'utiliser cette réponse . L'activation du shell est une très mauvaise idée sur un serveur SQL de production.
Vous pouvez obtenir le [nom d'hôte] \ [nom d'instance] par:
SELECT @@SERVERNAME;
Pour obtenir uniquement le nom d'hôte lorsque vous avez le format nom d'hôte \ nom d'instance:
SELECT LEFT(ltrim(rtrim(@@ServerName)), Charindex('\', ltrim(rtrim(@@ServerName))) -1)
Alternativement, comme l'a souligné @GilM:
SELECT SERVERPROPERTY('MachineName')
Vous pouvez obtenir l'adresse IP réelle en utilisant ceci:
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
Le serveur peut avoir plusieurs adresses IP sur lesquelles il écoute. Si votre connexion dispose de l'autorisation de serveur VIEW SERVER STATE, vous pouvez exécuter cette requête pour obtenir l'adresse que vous avez connectée à SQL Server:
SELECT dec.local_net_address
FROM sys.dm_exec_connections AS dec
WHERE dec.session_id = @@SPID;
Cette solution ne vous oblige pas à débourser le système d'exploitation via xp_cmdshell, qui est une technique qui doit être désactivée (ou du moins strictement sécurisée) sur un serveur de production. Cela peut vous obliger à accorder VIEW SERVER STATE à la connexion appropriée, mais cela représente un risque de sécurité bien moindre que l'exécution de xp_cmdshell.
La technique mentionnée par GilM pour le nom du serveur est la meilleure:
SELECT SERVERPROPERTY(N'MachineName');
La plupart des solutions pour obtenir l'adresse IP via t-sql tombent dans ces deux camps:
Exécuter ipconfig.exe
via xp_cmdshell
et analyser la sortie
Requête DMV sys.dm_exec_connections
Je ne suis pas fan de l'option n ° 1. L'activation de xp_cmdshell présente des inconvénients en matière de sécurité, et il y a de toute façon beaucoup d'analyses impliquées. C'est encombrant. L'option n ° 2 est élégante. Et c'est une solution pure t-sql, que je préfère presque toujours. Voici deux exemples de requêtes pour l'option 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;
Parfois, aucune des requêtes ci-dessus ne fonctionne, cependant. La requête n ° 1 renvoie NULL si vous êtes connecté via la mémoire partagée (connecté et exécutant SSMS sur l'hôte SQL). La requête n ° 2 peut ne rien renvoyer s'il n'y a aucune connexion utilisant un protocole de mémoire non partagée. Ce scénario est probable lors de la connexion à une instance SQL nouvellement installée. La solution? Forcer une connexion via TCP / IP. Pour ce faire, créez une nouvelle connexion dans SSMS et utilisez le préfixe «tcp:» avec le nom du serveur. Ensuite, réexécutez l'une ou l'autre des requêtes et vous obtiendrez l'adresse IP.
C'est dans la variable @@ SERVERNAME ;
SELECT @@SERVERNAME;
vous pouvez utiliser une requête en ligne de commande et l'exécuter dans mssql:
exec xp_cmdshell 'ipconfig'
xp_cmdshell
est activé dans la configuration de la sécurité du serveur
- Essayez ce script, il fonctionne selon mes besoins. Reformatez pour le lire.
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
Je sais que c'est un ancien message, mais peut-être que cette solution peut être utile lorsque vous souhaitez récupérer l'adresse IP et le port TCP d'une connexion de mémoire partagée (par exemple à partir d'un script exécuté dans SSMS localement sur le serveur). La clé est d'ouvrir une connexion secondaire à votre serveur SQL à l'aide d'OPENROWSET, dans lequel vous spécifiez «tcp:» dans votre chaîne de connexion. Le reste du code construit simplement du SQL dynamique pour contourner la limitation d'OPENROWSET de ne pas pouvoir prendre des variables comme paramètres.
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
d'être activé.