¿Cómo puedo encontrar todas las posiciones patindexen una tabla o variable?
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 
Esto vuelve 1pero quiero todos los resultados, por ejemplo:
pos
===
  1
 74
113
                    
                        sql-server
                                sql-server-2005
                                string-searching
                                
                    
                    
                        coditori
fuente
                
                
            fuente

1en una cadena que contiene solo ceros y unos. He usado Su solución y @ aaron-bertrand, pero obtuve los mismos resultados y el mismo rendimiento. ¿Qué solución sería mejor?Creo que esto será un poco más eficiente que el método de bucle que ha elegido ( alguna evidencia aquí ), y definitivamente más eficiente que el CTE recursivo:
Uso de la muestra:
Resultados:
Si sus cadenas serán más largas que 2K, use sys.all_columns en lugar de sys.all_objects. Si tiene más de 8K, agregue una unión cruzada.
fuente
- CTE recursivo
fuente
Me encanta la respuesta de Aaron Bertrand. Aunque no lo entiendo completamente, se ve muy elegante.
En el pasado me he encontrado con problemas con los permisos al usar
sys.objects. Combinado con la necesidad de solucionar el código, se me ocurrió una variación del código de Aaron y lo agregué a continuación.Este es mi procedimiento:
El
MAX(posid)valor también es el número de coincidencias encontradas.fuente
Este es un código simple basado en la respuesta de Aaron que:
CÓDIGO:
RESULTADO
fuente
sys.all_columns(puede usar cualquier fuente siempre que cubra la longitud de su cadena más larga), y también lo he vuelto a probar y no veo dónde extraño la última 'X'. .Perdón por venir tan tarde, pero me gustaría hacer las cosas más fáciles para las personas que quieren expandirse en esto. Estaba mirando cada una de estas implementaciones, tomé la que me pareció mejor (Aaron Bertrand), la simplifiqué y aquí tienes, tienes la "plantilla". Úsalo con sabiduría.
Solo como referencia: puede derivar otros comportamientos de esto, como expandir en PATINDEX ():
fuente
fuente