我有一个系统日志服务器,它将事件输入到SQL Server数据库中作为varchar
。数据看起来像这样你可以从SQL中的long varchar提取特定的文本字符串吗?
Apr 27 22:03:38 ServerName MSWinEventLog 3 Application 4217 Thu Apr 27 22:03:30 2017 1009 MSExchangeHM N/A Error ServerName 2 Microsoft Exchange Health ...
我想要做一个计数或任何唯一的错误ID出现的次数。错误ID始终以“2017”开头,在这种情况下,代码为1009.我试图找到一种方法来搜索该代码,或输出varchar
中“2017”的第一个实例后面的7行。
我是非常新的SQL,并且有一个很好的改变,我错过了一些可以使这更容易的知识,但这是我的方法,到目前为止。
SELECT
COUNT([key]) AS CountofErrors,
MAX(MSGTEXT) AS FULLMessage,
CASE
WHEN (CASE
WHEN LEFT(RIGHT(MSGTEXT, LEN(MSGTEXT) - 51), 12) LIKE 'a%'
THEN LEFT(RIGHT(MSGTEXT, LEN(MSGTEXT) - 51), 11)
ELSE RIGHT(LEFT(RIGHT(MSGTEXT, LEN(MSGTEXT) - 51), 12), 11)
END) LIKE 's%'
THEN LEFT(LEFT(RIGHT(MSGTEXT, LEN(MSGTEXT) - 52), 12), 6)
ELSE (CASE
WHEN LEFT(RIGHT(MSGTEXT, LEN(MSGTEXT) - 51), 12) LIKE 'a%'
THEN LEFT(RIGHT(MSGTEXT, LEN(MSGTEXT) - 51), 11)
ELSE RIGHT(LEFT(RIGHT(MSGTEXT, LEN(MSGTEXT) - 51), 12), 11)
END)
END AS system2
FROM
SyslogDatabase
WHERE
...
GROUP BY
...
此发现如果一个事件是一个应用程序错误或系统错误,因为这决定了有多少个字符会出现,直到事件ID。我可以看到,从这一点来看,这变得非常混乱,因为遵循应用程序或系统是一个数字,可以是1到5位数字。我希望有一个更好的方法来做到这一点。
感谢您的帮助,我接受了您的建议。出于某种原因,当我搜索“2007”时,我无法正确地获得结果,但是当我搜索该月份时,我得到了它的工作。我想我必须更多地了解这个定界的split8K函数的工作原理,然后才能弄清楚为什么它不能很好地工作。 –
@ J.Johnson它取决于你使用了哪个函数。我用于rextester演示的函数是'delimitedsplit8k'的原始版本,分隔符仅限于'char(1)',这就是为什么我用'char(30)'替换'2017'字符串并分割在'char(30)'上代替。如果你使用了我的答案底部的第二个函数('SplitStrings_Moden'),它支持更长的分隔符('varchar(255)')。 。 – SqlZim