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
sql-server
sql-server-2005
string-searching
coditori
fonte
fonte
1
na string que contém apenas zeros e uns. Eu usei Sua solução e @ aaron-bertrand, mas obtive os mesmos resultados e o mesmo desempenho. Qual solução seria melhor?Eu 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:
Uso da amostra:
Resultados:
Se suas strings tiverem mais de 2K, use sys.all_columns em vez de sys.all_objects. Se for maior que 8K, adicione uma junção cruzada.
fonte
- CTE recursiva
fonte
Adoro a resposta de Aaron Bertrand. Embora eu não o entenda completamente, parece realmente 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 no código de Aaron e o adicionei abaixo.Este é o meu procedimento:
O
MAX(posid)
valor também é o número de correspondências encontradas.fonte
Este é um código simples baseado na resposta de Aaron que:
CÓDIGO:
RESULTADO
fonte
sys.all_columns
(você pode usar qualquer fonte, desde que cubra o comprimento da sua corda mais longa), e também re-testei e não vejo onde sinto falta do último 'X' .. .Desculpa pessoal chegar tão tarde, mas eu gostaria de facilitar as coisas para as pessoas que querem expandir isso. Eu estava olhando para cada uma dessas implementações, peguei a que me pareceu melhor (Aaron Bertrand), simplifiquei e aqui está, você tem o "modelo". Use com sabedoria.
Apenas como referência - você pode derivar outros comportamentos disso, como expandir em PATINDEX ():
fonte
fonte