我有一個系統日誌服務器,它將事件輸入到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