我有一个需要搜索的数据库,里面装满了windows事件日志条目。
具体来说,我只需要返回一部分事件消息(以下示例中的“帐户名称:John”)。不幸的是,这必须使用SQL来完成,并且没有字符串开始或结束的设置字符,并且“John”部分可以是活动目录中的任何名称。 这似乎有点像Regex的工作,但我希望可能有一个我想念的替代品。
A user account was locked out.
Subject:
Security ID: SYSTEM
Account Name: WIN-R9H529RIO4Y$
Account Domain: WORKGROUP
Logon ID: 0x3e7
Account That Was Locked Out:
Security ID: WIN-R9H529RIO4Y\John
Account Name: John
Additional Information:
Caller Computer Name: WIN-R9H529RIO4Y
思想?
答案 0 :(得分:0)
这可能不是解决问题的最有效方法,但似乎确实有效。
我故意将其冗长,以便可以理解,但如果您愿意,可以轻松地将其简化为单一陈述:
declare @string varchar(max) =
'A user account was locked out.
Subject:
Security ID: SYSTEM
Account Name: WIN-R9H529RIO4Y$
Account Domain: WORKGROUP
Logon ID: 0x3e7
Account That Was Locked Out:
Security ID: WIN-R9H529RIO4Y\John
Account Name: John
Additional Information:
Caller Computer Name: WIN-R9H529RIO4Y';
declare @AccountStartIndex int =
len(@string) - charindex(reverse('Account Name: '), reverse(@string));
declare @AccountEndIndex int =
charindex(char(13) + char(10), @string, @AccountStartIndex);
select substring(
@string,
@AccountStartIndex + 2,
@AccountEndIndex - @AccountStartIndex - 1);
它的工作原理是在字符串中找到Account Name:
的最后一次出现,然后计算出跟随它的换行符的位置。通过这两条信息,我们可以将John
子串出来。