2008-09-26 17 views

Antwort

3
select @@servername 
35

Sie können die [Hostname] erhalten \ [instancename] von:

SELECT @@SERVERNAME; 

nur den Hostnamen zu erhalten, wenn Sie Hostname \ Instanzname Format haben:

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

Alternativ als @GilM wies darauf hin:

SELECT SERVERPROPERTY('MachineName') 

Sie können die tatsächliche IP-Adresse dieses:

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 

Source of the SQL script.

2

Ein einfacher Weg, um die Computernamen ohne die \ InstanceName zu bekommen ist:

SELECT SERVERPROPERTY('MachineName') 
15

Der Server hat möglicherweise mehr IP-Adressen, die er auf zuhört. Wenn die Verbindung die VIEW SERVER STATE-Server die Berechtigung hat es gewährt, können Sie diese Abfrage ausführen, um die Adresse, die Sie SQL Server verbunden haben zu erhalten:

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

Diese Lösung nicht Sie benötigen, um das Betriebssystem zu berappen über xp_cmdshell, eine Technik, die auf einem Produktionsserver deaktiviert (oder zumindest streng gesichert) werden sollte. Es kann erforderlich sein, dass Sie VIEW SERVER STATE der entsprechenden Anmeldung erteilen, aber das ist ein weitaus kleineres Sicherheitsrisiko als das Ausführen von xp_cmdshell.

Die Technik von Gilm für den Servernamen erwähnt ist die bevorzugte ein:

SELECT SERVERPROPERTY(N'MachineName'); 
+0

Vielen Dank für diese Antwort ... Ich glaube, dass dies der richtige Weg ist der Servers-IP-Adresse zu bestimmen, ob Sie es von der Client-Anschlussseite überprüfen müssen, besonders, wenn die Verbindung des Client mit einer Verbindungszeichenfolge festgelegt wurde, dass enthielt einen SQL-Alias ​​oder eine benannte Instanz als Datenquelle. –

+0

upvoted für sagen, nicht nur zu blockieren xp_cmdshell, aber streng gesichert zu gewährleisten – SheldonH

90
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 finden Sie die IP-Adresse geben;

Dies funktioniert für eine Remote-Client-Anfrage an SQL 2008 und neuer.

Wenn Sie Shared Memory-Verbindungen erlaubt, dann oben auf dem Server ausgeführt selbst finden Sie

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

‚client_net_address‘ ist die Adresse des Computers, der die Anforderung von entstanden, während ‚local_net_address‘ der SQL-Server (also NULL über Shared Memory-Verbindungen), und die Adresse, die Sie jemandem geben würde, wenn sie können, wäre Verwenden Sie aus irgendeinem Grund nicht den NetBios-Namen oder FQDN des Servers.

Ich rate dringend davon ab, this answer zu verwenden. Das Aktivieren der Shell ist auf einem Produktions-SQL Server eine sehr schlechte Idee.

+0

Gute Antwort, außer ich bekomme eine negative Port-Nummer (-15736) für einen Port, der 49800 sein sollte. Wenn negativ ist es sicher, nur 65536 hinzufügen? – crokusek

+0

Wenn jemand sich aus der Ferne in den SQL-Server meines Computers einloggen möchte, welche IP gebe ich ihm dann? local_net_address oder client_net_address? –

+0

Es funktioniert nicht auf 2012 - Adresse ist null – scar80

7

Die meisten Lösungen für das Erhalten der IP-Adresse über T-SQL fallen in diesen beiden Lagern:

  1. Run ipconfig.exe über xp_cmdshell und analysieren die Ausgangs

  2. Abfrage DMV sys.dm_exec_connections

Ich bin kein Fan von Option # 1. Die Aktivierung von xp_cmdshell hat Sicherheitsnachteile, und es gibt sowieso eine Menge Parsing. 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:

Manchmal funktioniert keine der obigen Abfragen, obwohl. Abfrage # 1 gibt NULL zurück, wenn Sie über Shared Memory (angemeldet und SSMS auf dem SQL-Host ausgeführt) verbunden sind. Abfrage Nr. 2 kann nichts zurückgeben, wenn keine Verbindungen ein Nicht-Shared-Memory-Protokoll verwenden. 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 Abfrage erneut aus, und Sie erhalten die IP-Adresse.

SSMS - Connect to Database Engine

+0

Super danke für den Tipp! Arbeitete perfekt für mich. – Munk

+0

Das wird ipv4 geben .. können wir ipv6 bekommen? –

0

Ich weiß, das ist eine alte Post, aber vielleicht kann diese Lösung sehr nützlich sein, wenn Sie die IP-Adresse und TCP-Port von einer Shared Memory-Verbindung (zB aus einem Skript in SSMS lokal ausgeführt abrufen mögen auf der Server). Der Schlüssel besteht darin, eine sekundäre Verbindung zu Ihrem SQL Server mit OPENROWSET zu öffnen, in dem Sie in Ihrer Verbindungszeichenfolge 'tcp:' angeben. Der Rest des Codes erstellt lediglich dynamisches SQL, um die Beschränkung von OPENROWSET zu umgehen, Variablen nicht als Parameter verwenden zu können.

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 
3

können Sie Befehlszeile Abfrage und führen in MSSQL verwenden:

exec xp_cmdshell 'ipconfig' 
+0

Das funktioniert nur, wenn 'xp_cmdshell' in der Server-Sicherheitskonfiguration aktiviert ist – D0dger

1

--Try dieses Skript, um es auf meine Bedürfnisse funktioniert. Reformat 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; 
Verwandte Themen