none
¿Como hacer consulta de una palabra o frase en todas las tablas de sql y me arroje los resultados? RRS feed

  • Pregunta

  • Hola lo que tengo que hacer es un sistema de consultas que por medio de cada palabra o frase me arroje un resultado encontrado de cada campo de cada tabla si fueran tan amables de ayudarme por favor

     tengo una base de datos llamada Centro_de_informacion en ella tengo 2 tablas que son: Registros y Índice (la tabla Registros id_claveR esta referenciada con la tabla indice  id_clave), como puedo hacer un procedimiento almacenado para que me haga  consultas de una palabra o frase en cada campo de las 2 tablas y los que encuentre con dicha frase me arroje el resultado de los registros con esa frase o palabra.

    En cada tabla hay alrededor de 6500 Registros

    Registros(

    id_ClaveR varchar(12) not null primary key,
    Categoria varchar(50),
    Titulo varchar(300),
    Autor varchar(300),
    Editorial varchar(100),
    Edicion varchar(100),
    Fecha_Edicion varchar(30)

    )

    Indice

    (

    Id_Clave varchar(12),
    Tema nvarchar(max),
    foreign key (Id_Clave) references  Registros(Id_Clave)

    )


    • Editado J.Emmanuel jueves, 8 de octubre de 2015 17:02
    jueves, 8 de octubre de 2015 15:29

Respuestas

  • Saludos,

    Te vas a tener que registrar pero aqui esta un query que hace justo lo que quieres, aunque es algo tardado 

    http://www.sqlservercentral.com/scripts/SQL+Server+2005/62066/  

    jueves, 8 de octubre de 2015 18:25
  • Aunque no se cuanto afecte esto al rendimiento de la BD.

    Esa consulta ocasionará un barrido completo de las tablas (full table scan o clustered index scan). En general eso es malo para el rendimiento, pero en este caso concreto el autor de la pregunta dijo que solo hay 6500 registros en cada tabla, que es una cifra insignificante para SQL Server, así que la consulta se ejecutará de manera prácticamente instantánea pese al barrido completo.
    viernes, 9 de octubre de 2015 6:07

Todas las respuestas

  • la pregunta que tu haces es realmente complicada, dependiendo de que pretendas y de que tanto te importe el rendimiento y de cuantos registros haya.

    La respuesta fácil, hazte un procedimiento guarda en tablas temporales los resultados de cada tabla de esta forma

    create procedure demo  @palabraquebusco varchar(100)

    as

    begin

    set @palabraquegusco='%'+@palabraquebusco +'%

    select * into #registros  from

    (select id_claveR, 'registros' as origen from registros where Categoria like @palabraquebusco

    union

    select * from Titulo where Categoria like @palabraquebusco

    ...

    ) a

    insert into #registros

    select  id_clave ,'indice' as origen from índice where tema like @palabraquebusco

    select  * from #registros

    Pero esto será lento y poco eficiente.

    si hablamos de unos pocos miles de filas... quizá. si hablamos de mas, considera usar full text search


    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA

    jueves, 8 de octubre de 2015 15:42
    Moderador
  • Hola J.Emmanuel,

    A menos que tengas otro objetivo, no es la manera correcta de hacer filtros. Se debe obtener registros en base a la coincidencia (exacta o aproximada) de un valor respecto a su columna, no de cualquier columna, es decir, si quieres buscar los libros del autor García Marqués tiene poco sentido que también busques ese valor en las columnas [Editorial] o [Edicion] o peor aún en la columna [Fecha_Edicion].

    Para realizar búsquedas por criterios deberás mandar un valor por cada columna, Null en caso no quieras filtrar por una columna y un valor (exacto o aproximado) por las columnas que deseas filtar, algo como:

    WHERE
            (Titulo = @Titulo OR @Titulo IS NULL)
            (Autor = @Autor OR @Autor IS NULL)
            (Editorial = @Editorial OR @Editorial IS NULL)
            (Edicion = @Edicion OR @Edicion IS NULL)

    De tal forma que si quieres buscar todos los libros del autor García Marqués para la editorial Minerva deberás hacer lo siguiente:

    @Titulo = Null; Autor =  García Marques; Editorial = Minerva; Edicion = Null;

    Queda claro que los ejemplos son con coincidencias exactas, si quieres coincidencias aproximadas deberás utilizar el predicado LIKE

    jueves, 8 de octubre de 2015 15:49
  • talvez algo asi te pueda servir

    declare @palabra varchar(max)

    select

    *

    from Registros re inner join indice ind on re.id_clave = ind.id_clave

    where categoria like '%' + @palabra + '%'

    or titulo like '%' + @palabra + '%'

    or autor like '%' + @palabra + '%'

    or editorial like '%' + @palabra + '%'

    or edicion like '%' + @palabra + '%'

    or fecha_edicion like '%' + @palabra + '%'

    or tema like '%' + @palabra + '%'

    Aunque no se cuanto afecte esto al rendimiento de la BD.

    Espero haberte ayudado



    Vladimir Miranda Desarrollador Jr.



    jueves, 8 de octubre de 2015 15:54
  • Hola amigo te agradezco por tu respuesta ese buscador es un sistema que voy a hacer y se utilizara para puras consultas para los libros de una biblioteca, pero entonces como puedo implementar el full text search.
    jueves, 8 de octubre de 2015 17:10
  • Saludos,

    Te vas a tener que registrar pero aqui esta un query que hace justo lo que quieres, aunque es algo tardado 

    http://www.sqlservercentral.com/scripts/SQL+Server+2005/62066/  

    jueves, 8 de octubre de 2015 18:25
  • Aunque no se cuanto afecte esto al rendimiento de la BD.

    Esa consulta ocasionará un barrido completo de las tablas (full table scan o clustered index scan). En general eso es malo para el rendimiento, pero en este caso concreto el autor de la pregunta dijo que solo hay 6500 registros en cada tabla, que es una cifra insignificante para SQL Server, así que la consulta se ejecutará de manera prácticamente instantánea pese al barrido completo.
    viernes, 9 de octubre de 2015 6:07