जवाबों:
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 machine>' को 'client_net_address' में दिखाया जाएगा।'client_net_address' उस कंप्यूटर का पता है जिसे अनुरोध से उत्पन्न किया गया था, जबकि 'local_net_address' SQL सर्वर होगा (इस प्रकार साझा मेमोरी कनेक्शन से अधिक), और पता आपको किसी ऐसे व्यक्ति को देना होगा जो वे सर्वर के नेटबायस का उपयोग नहीं कर सकते किसी कारण से नाम या FQDN।
मैं इस जवाब का उपयोग करने के खिलाफ दृढ़ता से सलाह देता हूं । शेल को सक्षम करना उत्पादन SQL सर्वर पर एक बहुत बुरा विचार है।
आप [hostname] \ [instancename] द्वारा प्राप्त कर सकते हैं:
SELECT @@SERVERNAME;
केवल होस्टनाम प्राप्त करने के लिए जब आपके पास होस्टनाम \ इंस्टेंस नाम प्रारूप हो:
SELECT LEFT(ltrim(rtrim(@@ServerName)), Charindex('\', ltrim(rtrim(@@ServerName))) -1)
वैकल्पिक रूप से @GMM ने बताया:
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
सर्वर में कई आईपी पते हो सकते हैं जो यह सुन रहा है। यदि आपके कनेक्शन में VIEW SERVER STATE सर्वर अनुमति दी गई है, तो आप SQL सर्वर से जुड़े पते को प्राप्त करने के लिए इस क्वेरी को चला सकते हैं:
SELECT dec.local_net_address
FROM sys.dm_exec_connections AS dec
WHERE dec.session_id = @@SPID;
इस समाधान के लिए आपको xp_cmdshell के माध्यम से OS पर जाने की आवश्यकता नहीं है, जो एक ऐसी तकनीक है जिसे उत्पादन सर्वर पर अक्षम (या कम से कम सख्ती से सुरक्षित) होना चाहिए। आपको उपयुक्त लॉगिन में VIEW SERVER STATE देने की आवश्यकता हो सकती है, लेकिन यह xp_cmchell चलाने की तुलना में बहुत छोटा सुरक्षा जोखिम है।
गिल्म द्वारा सर्वर नाम के लिए उल्लिखित तकनीक पसंदीदा है:
SELECT SERVERPROPERTY(N'MachineName');
टी-एसक्यूएल के माध्यम से आईपी पते प्राप्त करने के लिए अधिकांश समाधान इन दो शिविरों में आते हैं:
के ipconfig.exeमाध्यम से चलाएँ xp_cmdshellऔर आउटपुट पार्स करें
क्वेरी DMV sys.dm_exec_connections
मैं विकल्प # 1 का प्रशंसक नहीं हूं। Xp_cmdshell को सक्षम करने में सुरक्षा कमियां हैं, और वैसे भी बहुत सारे पार्सिंग शामिल हैं। वह बोझिल है। विकल्प # 2 सुरुचिपूर्ण है। और यह एक शुद्ध टी-एसक्यूएल समाधान है, जिसे मैं लगभग हमेशा पसंद करता हूं। यहां विकल्प 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;
कभी-कभी, उपरोक्त प्रश्नों में से कोई भी काम नहीं करता है, हालांकि। यदि आप साझा मेमोरी (SQL होस्ट पर SSMS लॉग इन और रनिंग) से जुड़े हैं, तो क्वेरी # 1 रिटर्न भरती है। यदि गैर-साझा मेमोरी प्रोटोकॉल का उपयोग कर कोई कनेक्शन नहीं हैं, तो क्वेरी # 2 कुछ भी नहीं लौटा सकती है। जब नया स्थापित SQL इंस्टेंस से जुड़ा हो तो यह परिदृश्य संभव है। समाधान? टीसीपी / आईपी पर एक कनेक्शन को मजबूर करें। ऐसा करने के लिए, SSMS में एक नया कनेक्शन बनाएं और सर्वर नाम के साथ "tcp:" उपसर्ग का उपयोग करें। फिर या तो क्वेरी को फिर से चलाएं और आपको आईपी एड्रेस मिलेगा।
यह @@ SERVERNAME चर में है;
SELECT @@SERVERNAME;
आप कमांड लाइन क्वेरी का उपयोग कर सकते हैं और mssql में निष्पादित कर सकते हैं:
exec xp_cmdshell 'ipconfig'
xp_cmdshellसर्वर सुरक्षा कॉन्फ़िगरेशन में सक्षम होने पर ही काम करेगा
- इस स्क्रिप्ट की कोशिश करो यह मेरी जरूरतों के लिए काम करता है। इसे पढ़ने के लिए सुधार।
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
मुझे पता है कि यह एक पुरानी पोस्ट है, लेकिन शायद यह समाधान तब उपयोगी हो सकता है जब आप एक साझा मेमोरी कनेक्शन से आईपी एड्रेस और टीसीपी पोर्ट को पुनः प्राप्त करना चाहते हैं (जैसे कि सर्वर पर स्थानीय रूप से एसएसएमएस में चलने वाली स्क्रिप्ट से)। कुंजी OPENROWSET का उपयोग करके अपने SQL सर्वर के लिए एक माध्यमिक कनेक्शन खोलने के लिए है, जिसमें आप अपने कनेक्शन स्ट्रिंग में 'tcp:' निर्दिष्ट करते हैं। बाकी कोड केवल गतिशील SQL का निर्माण कर रहा है ताकि OPENROWSET की सीमा के आसपास चर को इसके मापदंडों के रूप में लेने में सक्षम न हो।
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चालू करने की आवश्यकता है।