declare @name nvarchar(max)
set @name ='ali reza dar yek shabe barani ba yek dokhtare khoshkel be disco raft va ali baraye 1 saat anja bud va sepas... ali...'
Declare @a table (pos int)
Declare @pos int
Declare @oldpos int
Select @oldpos=0
select @pos=patindex('%ali%',@name)
while @pos > 0 and @oldpos<>@pos
begin
insert into @a Values (@pos)
Select @oldpos=@pos
select @pos=patindex('%ali%',Substring(@name,@pos + 1,len(@name))) + @pos
end
Select * from @a
Чтобы сделать его многократно используемым, вы можете использовать его в табличной функции для вызова следующим образом:
Select * from dbo.F_CountPats ('ali reza dar yek shabe barani ba yek dokhtare khoshkel be disco raft va ali baraye 1 saat anja bud va sepas... ali...','%ali%')
Функция может выглядеть так
Create FUNCTION [dbo].[F_CountPats]
(
@txt varchar(max),
@Pat varchar(max)
)
RETURNS
@tab TABLE
(
ID int
)
AS
BEGIN
Declare @pos int
Declare @oldpos int
Select @oldpos=0
select @pos=patindex(@pat,@txt)
while @pos > 0 and @oldpos<>@pos
begin
insert into @tab Values (@pos)
Select @oldpos=@pos
select @pos=patindex(@pat,Substring(@txt,@pos + 1,len(@txt))) + @pos
end
RETURN
END
GO
1
в строке, которая содержит только нули и единицы. Я использовал Ваше решение и @ aaron-bertrand, но получил те же результаты и ту же производительность. Какое решение будет лучше?Я думаю, что это будет немного более эффективно, чем выбранный вами метод зацикливания ( некоторые доказательства здесь ), и определенно более эффективно, чем рекурсивный CTE:
Пример использования:
Результаты:
Если ваши строки будут длиннее 2 КБ, используйте sys.all_columns вместо sys.all_objects. Если длина больше 8 КБ, добавьте перекрестное соединение.
источник
- рекурсивный CTE
источник
Мне нравится ответ Аарона Бертран. Хотя я не совсем понимаю, это выглядит действительно элегантно.
В прошлом я сталкивался с проблемами с разрешениями при использовании
sys.objects
. В сочетании с необходимостью устранения неполадок в коде я предложил вариант кода Аарона и добавил его ниже.Это моя процедура:
MAX(posid)
Значение также количество найденных совпадений.источник
Это простой код, основанный на ответе Аарона, который:
КОД:
РЕЗУЛЬТАТ
источник
sys.all_columns
(вы можете использовать любой источник, если он охватывает длину вашей самой длинной строки), и я также перепроверил и не вижу, где я пропускаю последний 'X' .. .Извините, ребята, что зашли так поздно, но я бы хотел упростить ситуацию людям, которые хотят это расширить. Я смотрел на каждую из этих реализаций, взял ту, которая показалась мне лучшей (Аарон Бертран), упростила ее и вот, у вас есть «шаблон». Использовать его с умом.
Просто для справки - вы можете извлечь из этого другие варианты поведения, например, развернуть в PATINDEX ():
источник
источник