Найти записи, где строковые значения похожи - PullRequest
0 голосов
/ 21 октября 2019

Я агрегирую ошибки, чтобы отслеживать общее количество ошибок, которые регистрируются. В настоящее время я пытаюсь создать запрос, который находит / группирует несколько записей, имеющих одинаковое значение, чтобы записать их как одну ошибку, а не несколько отдельных. Единственная разница - id или 2, поэтому они группируются. База данных вводится с ошибками из нашей системы через понимание приложений и аналитический поток. У меня есть таблица, содержащая ошибку «шаблона», которая будет использоваться для поиска и группировки этих конкретных ошибок. Не все записываемые ошибки нуждаются в шаблоне, потому что они сгруппированы надлежащим образом, потому что они абсолютно одинаковы. При попытке использовать , например, , чтобы найти ошибки, кажется, что с черточками трудно работать. Мне трудно найти информацию, чтобы помочь мне с этой проблемой. Я пытался использовать замену для удаления тире, но это не работает, потому что ошибки слишком длинные.

Образец шаблона:

Auto Resubmit for % failed with ' Object reference not set to an instance of an object. '

Ошибка образца:

Auto Resubmit for 004e9e2d-3704-4cfd-a90d-42520203df79 - 18723191 failed with ' Object reference not set to an instance of an object. '

Auto Resubmit for 0130e64e-64e6-4a23-88a4-51fba823705b - 18734821 failed with ' Object reference not set to an instance of an object. '

Auto Resubmit for 11809bf5672f4e98987119dbd06e5d78 - 17359076 failed with ' Object reference not set to an instance of an object. '

Пример запроса:

select top 1000 * from errorTable where error like 'Auto Resubmit for % failed with '' Object reference not set to an instance of an object.'

Ответы [ 2 ]

0 голосов
/ 22 октября 2019

Одна из основных причин, по которой вы не можете использовать Template Table, заключается в том, что вы в основном потерпели неудачу в самой цели шаблона, сохранив ошибку таким образом.

Другими словами, ваша таблица неNormalize ни один relation не может быть определен между 2 таблицами.

Auto Resubmit for 004e9e2d-3704-4cfd-a90d-42520203df79 - 18723191 failed with 
' Object reference not set to an instance of an object. '

Ваш дизайн таблицы ошибок должен выглядеть следующим образом:

TemplateID -- id column of Template table
Module -- Name of module from where error originated
SubmoduleName-- Method name
ErrorMessage-- Original error message like "Object reference not set to an instance of an object".
CustomError -- Auto Resubmit for 004e9e2d-3704-4cfd-a90d-42520203df79 - 18723191 failed with

Таким образом, вы можете легко объединить Template Table сError Table с использованием столбца ErrorMessage.

ErrorMessage : It should always contain original message thrown by `exception`.

Вы можете настроить таблицу ошибок в соответствии с вашими требованиями. Это займет совсем немного усилий.

Было бы очень хорошо, если бы вы моглимагазин TemplateID (FK) в Error таблице. Все проблемы исчезнут сразу.

Короче, ведите таблицу таким образом, чтобы к ним легко было присоединиться без манипуляций со строками.

Не ясно, по какому шаблону % будетбыть заменой.

создать таблицу #Template (Templateid int identity (1,1), Template varchar (500)) вставить в значения #Template («Автоматическая повторная отправка для% завершена с ошибкой») Ссылка на объект не установлена ​​наэкземпляр объекта. '' ')

- выбрать * из # шаблона

create table #ErrorLog(Errorid int identity(1,1),ErrorMessage varchar(500))
 insert into #ErrorLog values
('Auto Resubmit for 004e9e2d-3704-4cfd-a90d-42520203df79 - 18723191 failed with ''Object reference not set to an instance of an object.''')
,('Auto Resubmit for 0130e64e-64e6-4a23-88a4-51fba823705b - 18734821 failed with ''Object reference not set to an instance of an object.''')
,('Auto Resubmit for 11809bf5672f4e98987119dbd06e5d78 - 17359076 failed with ''Object reference not set to an instance of an object.''' )
,('Auto Resubmit for itemid2 - 18137385 failed with '' Access Denied: userId=''12602174''' )

Использовать любую функцию split string, чтобы разделить таблицу шаблонов на '%' и сохранить ее в #temp таблица

create table #temp(Errorid int identity(1,1),ErrMsg varchar(500),rownum int)

insert into #temp
select value,row_number()over(order by (Select null))rn from #Template t
cross apply(select replace(value,'failed with','')value from string_split(t.Template,'%'))ca



select t1.* from
(
select el.ErrorMessage,c.ErrMsg,c.rownum from  #ErrorLog EL 
inner join  #temp c on  el.ErrorMessage like '%' +ErrMsg+'%' and c.rownum=1
)t1
inner join  #temp c1 on  t1.ErrorMessage like '%' +ltrim(c1.ErrMsg)+'%' and c1.rownum=2


select * from #temp
drop table #Template,#ErrorLog,#temp

Фактически, для написания почти идеального запроса 1 необходимо проанализировать данные и написать как можно больше тестовых примеров для него.

0 голосов
/ 22 октября 2019

Если единственное, что отличается, это значения параметров, вы можете нормализовать строку перед ее сохранением / проверкой. Есть много утилит, которые могут это сделать. Одним из примеров является функция ExtractSQLTemplate в наших бесплатных инструментах SDU. Вам не нужно использовать инструментарий. Просто возьмите код для этой функции в качестве примера. Вы можете увидеть это здесь: https://youtu.be/yX5q00m_uCA

Другой вариант - вместо этого использовать полнотекстовый индекс для строки. Вы можете использовать такие функции, как FREETEXTTABLE и / или FREETEXT, чтобы найти сходства между строками.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...