2008-09-26 20 views

उत्तर

35

आप प्राप्त कर सकते हैं [होस्ट नाम] \ [InstanceName] द्वारा:

SELECT @@SERVERNAME; 

केवल होस्ट नाम प्राप्त करने के लिए आप होस्ट नाम \ उदाहरण के नाम प्रारूप है जब:

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

वैकल्पिक रूप से के रूप में @GilM ने बताया:

SELECT SERVERPROPERTY('MachineName') 
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: 403,210 आप इस का उपयोग कर वास्तविक IP पते मिल सकता है।

2

\ InstanceName बिना मशीन नाम पाने के लिए एक आसान तरीका है:

SELECT SERVERPROPERTY('MachineName') 
15

सर्वर एकाधिक आईपी पतों है कि उस पर सुन रहा है हो सकता है।

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

यह समाधान के माध्यम से ओएस के लिए बाहर शैल करने के लिए आप की आवश्यकता नहीं है: अपने कनेक्शन देखें सर्वर स्थिति सर्वर अनुमति यह करने के लिए दी गई है, तो आपको पता आप SQL सर्वर से कनेक्ट किया है प्राप्त करने के लिए इस क्वेरी चला सकते हैं xp_cmdshell, जो एक ऐसी तकनीक है जिसे उत्पादन सर्वर पर अक्षम किया जाना चाहिए (या कम से कम सख्ती से सुरक्षित)। आपको उचित लॉगिन के लिए दृश्य सर्वर राज्य प्रदान करने की आवश्यकता हो सकती है, लेकिन यह xp_cmdshell चलाने से बहुत कम सुरक्षा जोखिम है।

एक तकनीक सर्वर नाम के लिए GilM ने उल्लेख पसंद किया जाता है:

SELECT SERVERPROPERTY(N'MachineName'); 
+0

धन्यवाद ... मेरा मानना ​​है कि अगर आप ग्राहक के कनेक्शन की ओर से यह सत्यापित करने के लिए, विशेष रूप से अगर ग्राहक का कनेक्शन एक कनेक्शन स्ट्रिंग के साथ स्थापित किया गया था की जरूरत है इस सर्वर का IP पता निर्धारित करने का सही तरीका है कि एक डेटा स्रोत के रूप में एक एसक्यूएल उपनाम या नामित उदाहरण निहित है। –

+0

सिर्फ xp_cmdshell को अवरुद्ध करने के लिए नहीं बल्कि सख्ती से सुरक्षित – 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 

कोड यहाँ आप आईपी पता देगा;

यह SQL 2008 और नए के लिए दूरस्थ क्लाइंट अनुरोध के लिए काम करेगा।

आप साझा किया है, तो मेमोरी कनेक्शन की अनुमति तो ऊपर सर्वर पर चल ही आप

  • "साझा स्मृति" 'local_net_address' के लिए 'net_transport' के मान, और
  • शून्य के रूप में दे देंगे, और
  • '<local machine>' 'client_net_address' में दिखाया जाएगा।

'client_net_address' कंप्यूटर कि अनुरोध से उत्पन्न की पता है, जबकि 'local_net_address' होगा एसक्यूएल सर्वर (इस प्रकार साझा स्मृति कनेक्शन पर शून्य), और पता आप किसी को देना होगा है अगर वे कर सकते हैं कुछ कारणों से सर्वर के नेटबीओस नाम या एफक्यूडीएन का उपयोग नहीं करते हैं।

मैं this answer का उपयोग करने के खिलाफ दृढ़ता से सलाह देता हूं। शेल आउट को सक्षम करना उत्पादन SQL सर्वर पर एक बहुत बुरा विचार है।

+0

सुनिश्चित करने के लिए उत्साहित है कि मुझे एक बंदरगाह के लिए एक नकारात्मक पोर्ट नंबर (-15736) मिल रहा है जो कि 49800 होना चाहिए। तो अगर नकारात्मक 65536 जोड़ना सुरक्षित है? – crokusek

+0

अगर कोई मेरे कंप्यूटर के SQL सर्वर में दूरस्थ रूप से लॉगिन करना चाहता है, तो मैं उसे कौन सा आईपी देता हूं? local_net_address या client_net_address? –

+0

यह 2012 पर काम नहीं कर रहा है - पता शून्य है – scar80

7

इन दोनों शिविरों में T-SQL गिरावट के माध्यम से आईपी पते प्राप्त करने के लिए सबसे समाधान:

  1. भागो ipconfig.exexp_cmdshell के माध्यम से और पार्स उत्पादन

  2. क्वेरी DMV sys.dm_exec_connections

मैं विकल्प # 1 का प्रशंसक नहीं हूं। Xp_cmdshell को सक्षम करने में सुरक्षा कमियां होती हैं, और वैसे भी बहुत सारे पार्सिंग शामिल होते हैं। यह बोझिल है। विकल्प # 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; 

कभी कभी, ऊपर प्रश्नों के न काम करता है, हालांकि: यहाँ # 2 विकल्प के लिए दो नमूना क्वेरी दी गई हैं। क्वेरी # 1 वापस लौटाता है अगर आप साझा मेमोरी से जुड़े हुए हैं (SQL होस्ट पर लॉग इन और एसएसएमएस चला रहे हैं)। गैर-साझा मेमोरी प्रोटोकॉल का उपयोग कर कोई कनेक्शन नहीं होने पर क्वेरी # 2 कुछ भी वापस नहीं आ सकता है। यह परिदृश्य संभवतः एक नए स्थापित SQL इंस्टेंस से कनेक्ट होने पर है। समाधान? टीसीपी/आईपी पर कनेक्शन को मजबूर करें। ऐसा करने के लिए, एसएसएमएस में एक नया कनेक्शन बनाएं और सर्वर नाम के साथ "tcp:" उपसर्ग का उपयोग करें। फिर या तो क्वेरी फिर से चलाएं और आपको आईपी पता मिलेगा।

SSMS - Connect to Database Engine

+0

बहुत बढ़िया धन्यवाद! मेरे लिए पूरी तरह से काम किया। – Munk

+0

यह आईपीवी 4 देगा .. क्या हम ipv6 प्राप्त कर सकते हैं? –

0

मैं जानता हूँ कि यह एक पुरानी पोस्ट है, लेकिन शायद इस समाधान जब आप एक साझा मेमोरी कनेक्शन (जैसे स्थानीय स्तर पर SSMS में चलने वाली स्क्रिप्ट से से आईपी पते और TCP पोर्ट प्राप्त करना चाहते हैं उपयोगी हो सकता है सर्वर)। कुंजी OPENROWSET का उपयोग कर अपने SQL सर्वर से द्वितीयक कनेक्शन खोलना है, जिसमें आप अपनी कनेक्शन स्ट्रिंग में 'tcp:' निर्दिष्ट करते हैं। शेष कोड केवल OPENROWSET की सीमाओं को अपने पैरामीटर के रूप में चर लेने में सक्षम नहीं होने के लिए गतिशील एसक्यूएल का निर्माण कर रहा है। इस स्क्रिप्ट यह मेरी जरूरतों के लिए काम करता --Try

exec xp_cmdshell 'ipconfig' 
3

आप आदेश पंक्ति क्वेरी का उपयोग और mssql में निष्पादित कर सकते हैं। इसे पढ़ने के लिए सुधार। इस प्रतिक्रिया के लिए

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; 
+0

यह केवल तभी काम करेगा जब सर्वर सुरक्षा कॉन्फ़िगरेशन में 'xp_cmdshell' सक्षम है – D0dger

1

:

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 
संबंधित मुद्दे