2008-09-26 153 views

回答

3
select @@servername 
35

你可以得到[主機名] \ [實例]由:

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 

Source of the SQL script

2

更簡單的方法來獲取機器名,不帶\實例是:

SELECT SERVERPROPERTY('MachineName') 
15

服務器可能有多個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'); 
+0

感謝這個反應......我認爲這是確定服務器的IP地址的正確的方法,如果你需要從客戶端的連接端驗證,特別是如果有一個連接字符串建立了客戶端的連接是包含一個SQL別名或命名實例作爲數據源。 – 2012-04-12 21:09:28

+0

upvoted表示不僅僅是爲了阻止xp_cmdshell,而是爲了確保嚴格保護 – SheldonH 2015-12-16 17:52:35

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 

這裏的代碼將會給你的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上啓用外殼是一個非常糟糕的主意。

+0

除了我得到一個負端口號(-15736)對於一個應該是49800的端口,這是一個很好的答案。所以如果負數是安全的,只需添加65536? – crokusek 2013-03-28 22:50:24

+0

如果有人想遠程登錄到我的電腦的SQL服務器,那麼我應該給他哪個IP? local_net_address或client_net_address? – 2013-05-08 21:27:30

7

用於獲得通過T-SQL秋天的IP地址爲這兩個陣營大多數解決方案:

  1. 通過xp_cmdshell運行ipconfig.exe和解析輸出

  2. 查詢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 - Connect to Database Engine

0

我知道這是一個古老的職位,但也許當你想要從一個共享內存連接(例如從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 
3

您可以使用命令行查詢,並在MSSQL執行:

exec xp_cmdshell 'ipconfig' 
1

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