#c# #regex
#c# #регулярное выражение
Вопрос:
У меня есть эта хранимая процедура, и мне дано имя таблицы (например: « userCompanyGrouping_tbl
«). Я должен извлечь сохраненные имена процессов, в которых используется данное имя таблицы.
Я использую выражение регулярного выражения CREATE PROCEDURE\s*(?<proc_name>.*|n)(.|n)*userCompanyGrouping_tbl
для извлечения хранимой процедуры из приведенного ниже файла sample .sql, и он работает очень медленно.
Я должен выполнить поиск по нескольким файлам в каталоге размером в ГБ. Результат получается очень медленным. Мне нужно более быстрое выражение регулярных выражений для извлечения имени процедуры.
Я использую движок регулярных выражений C #.
USE [BI]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[ActiveUsersRelatedCompanies_prc]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[ActiveUsersRelatedCompanies_prc]
GO
CREATE PROCEDURE [dbo].[ActiveUsersRelatedCompanies_prc]
@Usercompanyid INT
AS
Begin
select *
FROM dbo.ActiveUsersRelatedCompanies_tbl (NOLOCK)
WHERE userCompanyId in (
select ucg2.userCompanyId
from `userCompanyGrouping_tbl` u
inner join userCompanyGrouping_tbl ucg2
on isNull(u.subParentCompanyId,u.parentCompanyId) =
(case when u.subParentCompanyId is not null then ucg2.subParentCompanyId
else ucg2.parentCompanyId end)
where u.userCompanyId = @userCompanyID
)
order by userCompanyName, userGroup, fullName
END
Комментарии:
1. Первое, что приходит на ум: попробуйте добавить
^s*
в начале регулярного выражения, если оно соответствует вашим требованиям.2. @Smileek это не соответствует моим требованиям: (
3. Вы уверены, что регулярное выражение является вашим узким местом? Как обстоят дела с вводом-выводом с диска? Использовали ли вы какое-либо профилирование производительности для подтверждения своей гипотезы? 🙂
4. @Luaan для ввода-вывода я использую «var txtFiles = Directory . Перечислять файлы (sourceDirectory, » . «, SearchOption. AllDirectories);» для чтения файлов внутри каталогов……. Поэтому я думаю, что в этом есть большая проблема
Ответ №1:
Следующее регулярное выражение будет лучше, как написано выше:
^s*[^(--)]{0}(CREATE PROCEDURE|ALTER PROCEDURE)s (?<ParentProcName>(w|_|[|]|.)*)
«ParentProcName» будет фиксировать имя хранимой процедуры, которая либо создана, либо изменена