it-swarm.com.de

SQL - Abfrage, um die IP-Adresse des Servers abzurufen

Gibt es eine Abfrage in SQL Server 2005, mit der ich die IP oder den Namen des Servers abrufen kann?

79
Seibar
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 

Der Code hier gibt Ihnen die IP-Adresse;

Dies funktioniert für eine Remoteclientanforderung an SQL 2008 und höher.

Wenn Sie Shared Memory-Verbindungen zugelassen haben, erhalten Sie, wenn Sie oben auf dem Server selbst ausgeführt werden

  • "Shared Memory" als Wert für 'net_transport' und
  • NULL für 'local_net_address' und
  • '<local machine> 'wird in' client_net_address 'angezeigt.

'client_net_address' ist die Adresse des Computers, von dem die Anforderung stammt, während 'local_net_address' der SQL-Server ist (also NULL über Shared Memory-Verbindungen) und die Adresse, die Sie jemandem geben würden, wenn er das NetBios des Servers nicht verwenden kann Name oder FQDN aus irgendeinem Grund.

Ich rate dringend davon ab, diese Antwort zu verwenden. Das Aktivieren der Shell ist auf einem Produktions-SQL-Server keine gute Idee.

122
Jeff Muzzy

Sie können den [Hostnamen]\[Instanznamen] erhalten, indem Sie:

SELECT @@SERVERNAME;

So rufen Sie nur den Hostnamen ab, wenn Sie das Format Hostname\Instanzname haben:

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

Alternativ wie @GilM darauf hingewiesen:

SELECT SERVERPROPERTY('MachineName')

Sie können die tatsächliche IP-Adresse folgendermaßen ermitteln:

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

Quelle des SQL-Skripts .

33
Brian R. Bondy

Der Server hat möglicherweise mehrere IP-Adressen, die er abhört. Wenn Ihrer Verbindung die Serverberechtigung VIEW SERVER STATE erteilt wurde, können Sie diese Abfrage ausführen, um die Adresse abzurufen, mit der Sie eine Verbindung zu SQL Server hergestellt haben:

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

Diese Lösung erfordert nicht, dass Sie über xp_cmdshell eine Shell für das Betriebssystem ausführen. Dies ist eine Technik, die auf einem Produktionsserver deaktiviert (oder zumindest streng gesichert) werden sollte. Möglicherweise müssen Sie dem entsprechenden Login VIEW SERVER STATE zuweisen, dies ist jedoch ein weitaus geringeres Sicherheitsrisiko als die Ausführung von xp_cmdshell.

Die von GilM für den Servernamen erwähnte Technik ist die bevorzugte:

SELECT SERVERPROPERTY(N'MachineName');

Die meisten Lösungen zum Abrufen der IP-Adresse über t-sql fallen in diese beiden Lager:

  1. Lauf ipconfig.exe über xp_cmdshell und analysieren die Ausgabe

  2. Abfrage DMV sys.dm_exec_connections

Ich bin kein Fan von Option # 1. Das Aktivieren von xp_cmdshell weist Sicherheitsmängel auf, und es ist ohnehin viel Parsing erforderlich. Das ist umständlich. Option 2 ist elegant. Und es ist eine reine T-SQL-Lösung, die ich fast immer bevorzuge. Hier sind zwei Beispielabfragen für Option 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;

Manchmal funktioniert jedoch keine der obigen Abfragen. Abfrage Nr. 1 gibt NULL zurück, wenn Sie über Shared Memory verbunden sind (angemeldet und SSMS auf dem SQL-Host ausgeführt). Abfrage Nr. 2 gibt möglicherweise nichts zurück, wenn keine Verbindungen mit einem Protokoll ohne gemeinsamen Speicher bestehen. Dieses Szenario ist wahrscheinlich, wenn eine Verbindung zu einer neu installierten SQL-Instanz besteht. Die Lösung? Erzwinge eine Verbindung über TCP/IP. Erstellen Sie dazu eine neue Verbindung in SSMS und verwenden Sie das Präfix "tcp:" mit dem Servernamen. Führen Sie dann eine der Abfragen erneut aus, und Sie erhalten die IP-Adresse.

SSMS - Connect to Database Engine

9
Dave Mason

Es ist in der Variable @@ SERVERNAME ;

SELECT @@SERVERNAME;
8

sie können die Befehlszeilenabfrage verwenden und in mssql ausführen:

exec xp_cmdshell 'ipconfig'
6
Ranjana Ghimire

--Versuchen Sie dieses Skript, es funktioniert nach meinen Bedürfnissen. Formatieren Sie neu, um es zu lesen.

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;
4
Hank Freeman
select @@servername
3

Eine einfachere Möglichkeit, den Computernamen ohne den\InstanceName abzurufen, ist:

SELECT SERVERPROPERTY('MachineName')
2
GilM

Ich weiß, dass dies ein alter Beitrag ist, aber vielleicht kann diese Lösung nützlich sein, wenn Sie die IP-Adresse und den TCP Port von einer Shared Memory-Verbindung abrufen möchten (z. B. von einem in SSMS lokal ausgeführten Skript) Der Schlüssel besteht darin, mit OPENROWSET eine sekundäre Verbindung zu Ihrem SQL Server herzustellen, in der Sie in Ihrer Verbindungszeichenfolge 'tcp:' angeben Variablen können als Parameter verwendet werden.

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
0