DECLARE @ip VARCHAR(20), @hst VARCHAR(20), @sql VARCHAR(100), @str VARCHAR(100);
SET @str = 'PING ' + HOST_NAME();
CREATE TABLE #tmp (aa VARCHAR(200));
INSERT #tmp EXEC master..xp_cmdshell @str;
SELECT TOP 1 @ip = REPLACE(LEFT(aa, CHARINDEX(':', aa)-1), 'Reply from ', '')
FROM #tmp WHERE aa LIKE 'reply from %:%';
DROP TABLE #tmp;
SELECT @ip AS ClientIP;
原理:PING 本機主機名,解析回應行提取 IP。需啟用 xp_cmdshell 且網路允許 ICMP。
CREATE TABLE #tb (re VARCHAR(255));
INSERT #tb EXEC master..xp_cmdshell 'ipconfig /all';
SELECT 網卡實體位址 = SUBSTRING(re, CHARINDEX(':', re)+1, 255)
FROM #tb WHERE re LIKE '%Physical Address%';
DROP TABLE #tb;
解析 ipconfig /all 輸出,擷取 Physical Address 行後的 MAC 字串。
CREATE FUNCTION dbo.fn_FormatIP (@a VARCHAR(15))
RETURNS VARCHAR(15)
AS
BEGIN
DECLARE @s VARCHAR(15) = '';
WHILE CHARINDEX('.', @a) > 0
BEGIN
SET @s = @s + RIGHT('000' + LEFT(@a, CHARINDEX('.', @a)), 4); -- 含點號
SET @a = RIGHT(@a, LEN(@a) - CHARINDEX('.', @a));
END
SET @s = @s + RIGHT('000' + @a, 3); -- 最後一段不含點
RETURN @s;
END
測試:
SELECT dbo.fn_FormatIP('202.1.110.2'); -- 回傳 '202.001.110.002'
用途:IP 字串排序、比較、索引鍵值統一格式。
xp_cmdshell 需 sysadmin 權限且伺服器啟用該選項(sp_configure 'xp_cmdshell', 1)。CONNECTIONPROPERTY('client_net_address') (SQL 2008+) 或應用層傳遞 IP,避免啟用 xp_cmdshell 風險。