根據環境限制(是否允許 xp_cmdshell),提供三種取得 SQL Server 實體伺服器名稱與 IP 位址的方法。
SELECT SERVERPROPERTY('MachineName') AS PhysicalServerName;
SELECT @@SERVERNAME AS InstanceName;
SELECT HOST_NAME() AS ClientWorkstationName; -- 連線用戶端主機名
MachineName:實體/虛擬機器主機名(叢集環境下為作用中節點)。@@SERVERNAME:SQL Server 執行個體名稱(含具名實例)。HOST_NAME():發起連線的用戶端電腦名。-- 啟用 xp_cmdshell(需 sysadmin)
EXEC sp_configure 'show advanced options', 1; RECONFIGURE;
EXEC sp_configure 'xp_cmdshell', 1; RECONFIGURE;
DECLARE @ip VARCHAR(40), @ipline VARCHAR(200), @pos INT;
CREATE TABLE #temp (ipline VARCHAR(200));
INSERT #temp EXEC master..xp_cmdshell 'ipconfig';
SELECT @ipline = ipline FROM #temp WHERE UPPER(ipline) LIKE '%IPV4%';
IF @ipline IS NOT NULL BEGIN
SET @pos = CHARINDEX(':', @ipline);
SET @ip = LTRIM(RTRIM(SUBSTRING(@ipline, @pos + 1, LEN(@ipline) - @pos)));
SELECT @ip AS IPv4Address;
END
DROP TABLE #temp;
-- 用畢關閉 xp_cmdshell
EXEC sp_configure 'xp_cmdshell', 0; RECONFIGURE;
EXEC sp_configure 'show advanced options', 0; RECONFIGURE;
缺點:需 sysadmin、安全風險高、解析邏輯依賴作業系統語言版本(中文 "IPv4 位址" vs 英文 "IPv4 Address")。
SELECT
CONVERT(NVARCHAR(128), SERVERPROPERTY('SERVERNAME')) AS ServerName,
LOCAL_NET_ADDRESS AS SQLServerIP,
CLIENT_NET_ADDRESS AS ClientIP
FROM SYS.DM_EXEC_CONNECTIONS
WHERE SESSION_ID = @@SPID;
sys.dm_exec_connections 取得 IP。SERVERPROPERTY('MachineName')(實體)或 @@SERVERNAME(實例)。xp_cmdshell,若必須用請嚴格限制權限並用後即關閉。