在SQL Server 2005中是否有查詢可用於獲取服務器的IP或名稱?SQL - 查詢獲取服務器的IP地址
回答
select @@servername
它在@@SERVERNAME變量中;
SELECT @@SERVERNAME;
你可以得到[主機名] \ [實例]由:
SELECT LEFT(ltrim(rtrim(@@ServerName)), Charindex('\', ltrim(rtrim(@@ServerName))) -1)
或者爲:
SELECT @@SERVERNAME;
要當你的主機名\實例名稱格式只得到主機名@GilM指出:
SELECT SERVERPROPERTY('MachineName')
你可以用這個得到實際的IP地址:
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
更簡單的方法來獲取機器名,不帶\實例是:
SELECT SERVERPROPERTY('MachineName')
服務器可能有多個IP地址,它正在監聽。如果您的連接已授予其查看服務器狀態服務器許可,您可以運行此查詢來獲取您連接到SQL Server地址:
SELECT dec.local_net_address
FROM sys.dm_exec_connections AS dec
WHERE dec.session_id = @@SPID;
此解決方案不要求你通過掏出來的OS xp_cmdshell,這是一種應在生產服務器上禁用(或至少嚴格保護)的技術。它可能會要求您將VIEW SERVER STATE授予適當的登錄名,但這比運行xp_cmdshell的安全風險小得多。
通過GilM服務器名稱中提到的技術是最好的一個:
SELECT SERVERPROPERTY(N'MachineName');
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
這裏的代碼將會給你的IP地址;
這將適用於SQL 2008及更新版本的遠程客戶端請求。
如果您共享內存連接允許,然後在服務器上面運行本身會給你
- 「共享內存」作爲「net_transport」的價值,併爲「local_net_address」
- NULL,和
- '
<local machine>
'將顯示在'client_net_address'中。
「client_net_address」是該請求源自計算機的地址,而「local_net_address」將是SQL服務器(從而通過共享內存的連接NULL),地址你會給別人,如果他們能出於某種原因,不使用服務器的NetBIOS名稱或FQDN。
我強烈反對使用this answer。在生產SQL Server上啓用外殼是一個非常糟糕的主意。
除了我得到一個負端口號(-15736)對於一個應該是49800的端口,這是一個很好的答案。所以如果負數是安全的,只需添加65536? – crokusek 2013-03-28 22:50:24
如果有人想遠程登錄到我的電腦的SQL服務器,那麼我應該給他哪個IP? local_net_address或client_net_address? – 2013-05-08 21:27:30
用於獲得通過T-SQL秋天的IP地址爲這兩個陣營大多數解決方案:
通過
xp_cmdshell
運行ipconfig.exe
和解析輸出查詢DMV
sys.dm_exec_connections
我不喜歡選項#1。啓用xp_cmdshell具有安全缺陷,無論如何還有很多解析。這很麻煩。選項#2是優雅的。這是一個純粹的t-sql解決方案,我幾乎總是喜歡。以下是選項#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返回NULL。如果沒有使用非共享內存協議的連接,則查詢#2可能不會返回任何內容。連接到新安裝的SQL實例時,可能會出現這種情況。解決方案?通過TCP/IP強制連接。爲此,請在SSMS中創建一個新連接,並使用帶有服務器名稱的「tcp:」前綴。然後重新運行任一查詢,您將獲得IP地址。
我知道這是一個古老的職位,但也許當你想要從一個共享內存連接(例如從SSMS上本地運行的腳本的IP地址和TCP端口此解決方案可以是有用服務器)。關鍵是使用OPENROWSET打開到SQL Server的輔助連接,在連接字符串中指定'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
您可以使用命令行查詢,並在MSSQL執行:
exec xp_cmdshell 'ipconfig'
--Try這個腳本它的作品我的需要。重新格式化以讀取它。
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;
- 1. 獲取服務器IP地址
- 2. 獲取IP地址當前服務器
- 3. 如何獲取服務器IP地址?
- 4. 如何從SQL Server 2005中查詢服務器的IP地址?
- 5. 查找服務器的IP地址
- 6. 服務器的IP地址
- 7. 在服務器端獲取本地IP地址的非服務器端方法?
- 8. DNS服務器IP地址
- 9. tcp服務器ip地址
- 10. 如何獲取getaddrinfo查詢的DNS服務器的地址
- 11. 如何從IP地址獲取服務器的機器名稱?
- 12. 如何獲取響應WebResponse的服務器的IP地址C#
- 13. 如何獲取請求來自的服務器的IP地址?
- 14. 從服務器獲取客戶端的IP地址
- 15. 獲取WCF中的服務器IP地址?
- 16. 獲取域的IP地址和後端服務器信息
- 17. 如何在.NET中獲取服務器的IP地址?
- 18. 如何獲取asp.net中的服務器/網站IP地址?
- 19. node.js http(s):獲取遠程服務器的IP地址
- 20. 如何在rails上獲取主機服務器的IP地址
- 21. 在PHP中獲取服務器的主機名或IP地址
- 22. ASP.NET - 獲取服務器本地IP
- 23. Spring集成TCP服務器:獲取IP地址和負載
- 24. 在centos中獲取ldap服務器IP地址和端口號
- 25. 從JSP請求/會話對象獲取服務器IP地址
- 26. 從主機名獲取服務器IP地址
- 27. CSocket服務器獲取客戶端IP地址
- 28. 在無連接服務器上獲取遠程IP地址
- 29. 獲取IP地址
- 30. 獲取IP地址
感謝這個反應......我認爲這是確定服務器的IP地址的正確的方法,如果你需要從客戶端的連接端驗證,特別是如果有一個連接字符串建立了客戶端的連接是包含一個SQL別名或命名實例作爲數據源。 – 2012-04-12 21:09:28
upvoted表示不僅僅是爲了阻止xp_cmdshell,而是爲了確保嚴格保護 – SheldonH 2015-12-16 17:52:35