Como posso encontrar todas as posições patindex
em uma tabela ou variável?
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...'
select patindex('%ali%',@name) as pos
Isso retorna 1
, mas eu quero todos os resultados, por exemplo:
pos
===
1
74
113
Acho que isso será um pouco mais eficiente que o método de loop que você escolheu ( algumas evidências aqui ) e definitivamente mais eficiente que o CTE recursivo:
Exemplo de uso:
Resultados:
Se suas strings forem maiores que 2K, use sys.all_columns em vez de sys.all_objects. Se for maior que 8K, adicione uma junção cruzada.
Para torná-lo reutilizável, você pode usá-lo em uma função de tabela para chamá-lo como:
A função pode ficar assim
--CTE Recursivo
Eu amo a resposta de Aaron Bertrand. Embora eu não entenda completamente, parece muito elegante.
No passado, tive problemas com permissões ao usar
sys.objects
. Combinado com a necessidade de solucionar problemas do código, criei uma variação do código de Aaron e a adicionei abaixo.Este é o meu procedimento:
O
MAX(posid)
valor também é o número de correspondências encontradas.Este é um código simples baseado na resposta de Aaron que:
CÓDIGO:
RESULTADO
Desculpe, pessoal, por aparecer tão tarde, mas gostaria de facilitar as coisas para as pessoas que desejam expandir isso. Eu estava olhando cada uma dessas implementações, peguei a que me pareceu melhor (Aaron Bertrand), simplifiquei e aqui está, você tem o "template". Use-o com sabedoria.
Apenas como referência - você pode derivar outros comportamentos disso, como expandir em PATINDEX():