我在SQL Server中有一个包含ID和相应错误消息的错误日志表。在加载过程中,日志表由不同的服务填充,并且错误消息不可修改。日志表看起来像这样。
ID | Error Messsage
101 | 101 failed due to a error in xxx module.
102 | 102 failed due to a error in xxx module.
101 | Mapping for column xyz missing for 101
102 | Mapping for column xyz missing for 102
103 | Mapping for column xyz missing for 103
我想根据错误消息的类型对此进行分组,并显示错误消息的拆分及其计数。哪个看起来像这样
Error Message | Count
Failed due to a error in xxx module | 2
Mapping for column xyz missing | 3
目前,我正在使用like
运算符执行此操作,我在其中切换已知的错误类型并增加其计数。与此相关的一个大问题是,当遇到未知类型的错误时,过程失败并且只有ID更改才会多次显示相同的错误类型。
我已经看到Google Play商店应用评论被分组,看起来与此类似,虽然复杂得多。这看起来像一个有趣的问题,用类似的方法来解决。但我不知道如何处理这个问题。解决这个问题的任何链接或方法或对此的解释将会或将会起作用将会有很大帮助。
答案 0 :(得分:1)
添加新表:ErrorType:
TypeID | Message 1 | {0} failed due to a error in xxx module. 2 | Mapping for column xyz missing for {0}
并更改您的日志表和日志代码以使用ErrorType:
ID | TypeID 101 | 1 102 | 1 101 | 2 102 | 2 103 | 2
突然间你现在可以轻松地分组。此外,编写生成原始邮件的查询仍然很简单:
select l.ID, Replace(t.Message, '{0}', l.ID) As Message
from ErrorLogs l
inner join ErrorTypes t on t.TypeId = l.TypeID
当然,选择{0}
占位符是为了与.Net的String.Format()
方法兼容,因此您可以轻松等待在客户端进行自己的替换,甚至选择自己的邮件占位符,如果您不使用.Net。
真正令人满意的是,将来可以包含其他占位符,您可能希望将这些ErrorType重用于多个模块/列。我感觉你已经有这个问题,或者你不需要在问题中谈论LIKE
操作:
TypeID | Message 1 | {0} failed due to a error in {1} module. 2 | Mapping for column {1} missing for {0}
ID | TypeID | SupplementalData 101 | 1 | xxx 102 | 1 | xxx 101 | 2 | xyz 102 | 2 | xyz 103 | 2 | aaa
select l.ID,
Replace(Replace(t.Message, '{0}', l.ID), '{1}', l.SupplementalData) As Message
from ErrorLogs l
inner join ErrorTypes t on t.TypeId = l.TypeID
答案 1 :(得分:0)
您可以使用REPLACE()
函数删除等于同一行的ID列的字符串。
您可以使用空格来确保只删除整个ID而不是部分ID:
REPLACE(' '+[Error Message]+' ',' '+CAST([ID] AS varchar(31))+' ',' ')