You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解析MSSQL字符串?提取指定IP与端口方法求助

提取目标IP和端口的MSSQL解决方案

你的现有方法虽然能得到结果,但太依赖日志字符串的空格拆分逻辑——要是日志里多了个空格或者格式微调,这个查询就会失效。这里给你几个更灵活、容错性更强的实现方式:

方法一:用PATINDEX+SUBSTRING精准定位

这种方法不依赖空格拆分,直接锁定ethKASSY:后的IP和端口段,不管前后有没有多余空格都能正常工作:

DECLARE @logStr NVARCHAR(MAX) = '<166>%ASA-6-302013: Built outbound TCP connection 322558458 for ethKASSY:192.168.1.13/10001 (10.21.8.13/10001) to ethASK_EXT_TSSM:10.43.8.24/5508 (192.168.1.10/30475) '

-- 先提取ethKASSY:后面直到左括号的那段内容
DECLARE @targetPart NVARCHAR(100) = SUBSTRING(
    @logStr,
    PATINDEX('%ethKASSY:%', @logStr) + 9, -- 跳过"ethKASSY:"的长度
    PATINDEX('% (%', @logStr) - (PATINDEX('%ethKASSY:%', @logStr) + 9)
)

-- 拆分IP和端口
SELECT 
    LEFT(@targetPart, CHARINDEX('/', @targetPart) - 1) AS IPAddress,
    RIGHT(@targetPart, LEN(@targetPart) - CHARINDEX('/', @targetPart)) AS Port

思路说明:

  • 用PATINDEX找到ethKASSY:的位置,加上9(这个字符串的长度)定位到目标段的起点
  • 再找到第一个 (的位置,算出目标段的长度,提取出192.168.1.13/10001
  • 最后用CHARINDEX找到/的位置,拆分出IP和端口

方法二:改进你的STRING_SPLIT写法

如果还是想保留拆分的思路,可以调整匹配条件,不用精准匹配整个字符串,而是匹配包含目标IP的段:

DECLARE @logStr NVARCHAR(MAX) = '<166>%ASA-6-302013: Built outbound TCP connection 322558458 for ethKASSY:192.168.1.13/10001 (10.21.8.13/10001) to ethASK_EXT_TSSM:10.43.8.24/5508 (192.168.1.10/30475) '

SELECT 
    LEFT(value, CHARINDEX('/', value) - 1) AS IPAddress,
    RIGHT(value, LEN(value) - CHARINDEX('/', value)) AS Port
FROM STRING_SPLIT(@logStr, ' ') 
WHERE value LIKE 'ethKASSY:%192.168.1.13/%'

这样即使日志里有多余空格,只要目标段的前缀和IP存在,就能匹配到,然后拆分出IP和端口。

方法三:用OPENJSON处理复杂日志(SQL Server 2016+)

如果需要批量处理这类日志,或者要同时提取多个段的信息,可以把字符串转成JSON格式来解析,扩展性更好:

DECLARE @logStr NVARCHAR(MAX) = '<166>%ASA-6-302013: Built outbound TCP connection 322558458 for ethKASSY:192.168.1.13/10001 (10.21.8.13/10001) to ethASK_EXT_TSSM:10.43.8.24/5508 (192.168.1.10/30475) '

-- 提取"for"和"to"之间的内容,转换成JSON数组
DECLARE @json NVARCHAR(MAX) = '["' + 
    REPLACE(
        SUBSTRING(@logStr, PATINDEX('%for %', @logStr)+4, PATINDEX('% to %', @logStr)-(PATINDEX('%for %', @logStr)+4)),
        ' ', '","'
    ) + '"]'

SELECT 
    LEFT(value, CHARINDEX('/', value) - 1) AS IPAddress,
    RIGHT(value, LEN(value) - CHARINDEX('/', value)) AS Port
FROM OPENJSON(@json)
WHERE value LIKE 'ethKASSY:%'

这个方法适合处理更复杂的日志结构,后续要提取其他段(比如目标IP10.43.8.24)也很方便。


内容的提问来源于stack exchange,提问作者SourceSurfer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:25:11