Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

Procedimientos almacenados SQL

Estas en el tema de Procedimientos almacenados SQL en el foro de SQL Server en Foros del Web. Procedimientos almacenados Hola a todos, este es mi primer post en el foro, y si fuera posible, quisiera pedir su ayuda. Actualmente estoy trabajando con ...
  #1 (permalink)  
Antiguo 28/06/2012, 17:34
 
Fecha de Ingreso: junio-2012
Mensajes: 5
Antigüedad: 11 años, 9 meses
Puntos: 0
Procedimientos almacenados SQL

Procedimientos almacenados

Hola a todos, este es mi primer post en el foro, y si fuera posible, quisiera pedir su ayuda.

Actualmente estoy trabajando con una Base de Datos en SQLServer 2005 y ASP. Y necesito realizar una búsqueda en toda la base de datos, no sólo en algunas tablas sino en toda la base de datos y tengo problemas para realizar esta búsqueda, ya que es común realizar consultas a algunas tablas pero no es común realizar una consulta a toda la base de datos.

Buscando encontré una solución con un procedimiento almacenado en SQLServer, donde llamo al procedimiento almacenado pidiendo que me busque una cadena de texto y me trae todas las tablas que tienen algún campo con la coincidencia de la cadena de texto que puse a buscar.

El problema que tengo es que SQLServer me trae el resultado en diferentes tablas, y a todas las tablas les pone el mismo nombre, y cuando quiero rescatar los datos y llevarlos a ASP, tengo que poner el nombre de la tabla y sólo me trae un resultado, porque para ASP es una sola tabla y no varias con el mismo nombre.

Lo que yo quisiera es modificar el procedimiento almacenado y que en lugar de traerme varias tablas con el mismo nombre, me trajera una sola tabla con todos los resultados y así poder rescatar los datos y llevarlos a ASP.

Si alguien me pudiera ayudar estaría muy agradecida, porque me falta conocimiento en SQL Server y no sé cómo solucionar el problema que tengo.
El procedimiento almacenado lo obtuve de esta web.

http://gallery.technet.microsoft.com/scriptcenter/c0c57332-8624-48c0-b4c3-5b31fe641c58#content

Muchas gracias de antemano por toda la ayuda que me puedan brindar.

Última edición por portis9; 28/06/2012 a las 21:28
  #2 (permalink)  
Antiguo 29/06/2012, 11:27
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Procedimientos almacenados SQL

Pues es muy extraño que quieras buscar una cadena en toda la base, todas las tablas, pero bueno.

El store que nos compartes, es para Sybase, aunque si corre en SQL Server, al momento de hacer pruebas me manda mensajes de error:

EXEC SP_SearchTables @Tablenames = '%'
,@SearchStr = '%alonso%'

Msg 156, Level 15, State 1, Line 1
Incorrect syntax near the keyword 'Database'.
Msg 208, Level 16, State 1, Procedure SP_SearchTables, Line 129
Invalid object name 'SearchTMP'.
__________________
MCTS Isaias Islas
  #3 (permalink)  
Antiguo 29/06/2012, 12:22
 
Fecha de Ingreso: junio-2012
Mensajes: 5
Antigüedad: 11 años, 9 meses
Puntos: 0
Respuesta: Procedimientos almacenados SQL

Primero que todo, muchas gracias iislas por tomarte la molestia de responder.

Sí es una excepción lo que estoy haciendo, buscar en toda la base de dato, por la forma en la que estoy trabajando tuve que estructurar los datos en muchas tablas y ahora necesito rescatar algunos datos y no me queda más remedio que buscar en toda la base de datos.

Por favor prueba con esta consulta, creo que ahora si te funcionará bien:


EXEC SearchTables @Tablenames = '%'
,@SearchStr = '%alonso%'

Gracias
  #4 (permalink)  
Antiguo 29/06/2012, 12:37
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Procedimientos almacenados SQL

Me envia este error:

Msg 156, Level 15, State 1, Line 1
Incorrect syntax near the keyword 'Database'.
Msg 208, Level 16, State 1, Line 134
Invalid object name 'SearchTMP'.
__________________
MCTS Isaias Islas
  #5 (permalink)  
Antiguo 29/06/2012, 12:59
 
Fecha de Ingreso: junio-2012
Mensajes: 5
Antigüedad: 11 años, 9 meses
Puntos: 0
Respuesta: Procedimientos almacenados SQL

Que raro que no te funcione

Yo creo el Procedimiento Almacenado y luego hago la consulta y todo funciona bien.

Primero ejecuto este script:

Código:


IF OBJECT_ID('SearchTables','P') IS NOT NULL 
    DROP PROCEDURE SearchTables 
GO 
CREATE PROCEDURE SearchTables 
 @Tablenames VARCHAR(500) 
,@SearchStr NVARCHAR(60) 
,@GenerateSQLOnly Bit = 0 
AS 
 
/* 
    Parameters and usage 
 
    @Tablenames        -- Provide a single table name or multiple table name with comma seperated.  
                        If left blank , it will check for all the tables in the database 
    @SearchStr        -- Provide the search string. Use the '%' to coin the search.  
                        EX : X%--- will give data staring with X 
                             %X--- will give data ending with X 
                             %X%--- will give data containig  X 
    @GenerateSQLOnly -- Provide 1 if you only want to generate the SQL statements without seraching the database.  
                        By default it is 0 and it will search. 
 
    Samples : 
 
    1. To search data in a table 
 
        EXEC SearchTables @Tablenames = 'T1' 
                         ,@SearchStr  = '%TEST%' 
 
        The above sample searches in table T1 with string containing TEST. 
 
    2. To search in a multiple table 
 
        EXEC SearchTables @Tablenames = 'T2' 
                         ,@SearchStr  = '%TEST%' 
 
        The above sample searches in tables T1 & T2 with string containing TEST. 
     
    3. To search in a all table 
 
        EXEC SearchTables @Tablenames = '%' 
                         ,@SearchStr  = '%TEST%' 
 
        The above sample searches in all table with string containing TEST. 
 
    4. Generate the SQL for the Select statements 
 
        EXEC SearchTables @Tablenames        = 'T1' 
                         ,@SearchStr        = '%TEST%' 
                         ,@GenerateSQLOnly    = 1 
 
*/ 
 
    SET NOCOUNT ON 
 
    DECLARE @CheckTableNames Table 
    ( 
    Tablename sysname 
    ) 
 
    DECLARE @SQLTbl TABLE 
    ( 
     Tablename        SYSNAME 
    ,WHEREClause    VARCHAR(MAX) 
    ,SQLStatement   VARCHAR(MAX) 
    ,Execstatus        BIT  
    ) 
 
    DECLARE @sql VARCHAR(MAX) 
    DECLARE @tmpTblname sysname 
 
    IF LTRIM(RTRIM(@Tablenames)) IN ('' ,'%') 
    BEGIN 
 
        INSERT INTO @CheckTableNames 
        SELECT Name 
          FROM sys.tables 
    END 
    ELSE 
    BEGIN 
 
        SELECT @sql = 'SELECT ''' + REPLACE(@Tablenames,',',''' UNION SELECT ''') + '''' 
 
        INSERT INTO @CheckTableNames 
        EXEC(@sql) 
 
    END 
     
    INSERT INTO @SQLTbl 
    ( Tablename,WHEREClause) 
    SELECT SCh.name + '.' + ST.NAME, 
            ( 
                SELECT '[' + SC.name + ']' + ' LIKE ''' + @SearchStr + ''' OR ' + CHAR(10) 
                  FROM SYS.columns SC 
                  JOIN SYS.types STy 
                    ON STy.system_type_id = SC.system_type_id 
                   AND STy.user_type_id =SC.user_type_id 
                 WHERE STY.name in ('varchar','char','nvarchar','nchar') 
                   AND SC.object_id = ST.object_id 
                 ORDER BY SC.name 
                FOR XML PATH('') 
            ) 
      FROM  SYS.tables ST 
      JOIN @CheckTableNames chktbls 
                ON chktbls.Tablename = ST.name  
      JOIN SYS.schemas SCh 
        ON ST.schema_id = SCh.schema_id 
     WHERE ST.name <> 'SearchTMP' 
      GROUP BY ST.object_id, SCh.name + '.' + ST.NAME ; 
 
      UPDATE @SQLTbl 
         SET SQLStatement = 'SELECT * INTO SearchTMP FROM ' + Tablename + ' WHERE ' + substring(WHEREClause,1,len(WHEREClause)-5) 
 
      DELETE FROM @SQLTbl 
       WHERE WHEREClause IS NULL 
     
    WHILE EXISTS (SELECT 1 FROM @SQLTbl WHERE ISNULL(Execstatus ,0) = 0) 
    BEGIN 
 
        SELECT TOP 1 @tmpTblname = Tablename , @sql = SQLStatement 
          FROM @SQLTbl  
         WHERE ISNULL(Execstatus ,0) = 0 
 
          
 
         IF @GenerateSQLOnly = 0 
         BEGIN 
 
            IF OBJECT_ID('SearchTMP','U') IS NOT NULL 
                DROP TABLE SearchTMP 
            EXEC (@SQL) 
 
            IF EXISTS(SELECT 1 FROM SearchTMP) 
            BEGIN 
                SELECT Tablename=@tmpTblname,* FROM SearchTMP 
            END 
 
         END 
         ELSE 
         BEGIN 
             PRINT REPLICATE('-',100) 
             PRINT @tmpTblname 
             PRINT REPLICATE('-',100) 
             PRINT replace(@sql,'INTO SearchTMP','') 
         END 
 
         UPDATE @SQLTbl 
            SET Execstatus = 1 
          WHERE Tablename = @tmpTblname 
 
    END 
     
    SET NOCOUNT OFF 
 
go





Y luego ejecuto la consulta:


Código:
EXEC SearchTables @Tablenames = '%'
,@SearchStr = '%testeo%'

Lo pruebo en SQLServer Management Studio Express y todo funciona bien.

No sé que pueda estar fallando en tu prueba.

¿Dónde lo estás testeando?
  #6 (permalink)  
Antiguo 29/06/2012, 17:46
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Procedimientos almacenados SQL

SQL Server 2008 R2 Enterprise Edition 64 bits
__________________
MCTS Isaias Islas
  #7 (permalink)  
Antiguo 30/06/2012, 05:58
Avatar de Missi  
Fecha de Ingreso: agosto-2011
Mensajes: 391
Antigüedad: 12 años, 8 meses
Puntos: 43
Respuesta: Procedimientos almacenados SQL

Mira si te vale algo parecido a esto...

Código:
DECLARE @SQL AS VarChar(MAX)
SET @SQL = ''

SELECT @SQL = @SQL + 'SELECT * FROM ' + TABLE_SCHEMA + '.' + TABLE_NAME + CHAR(13)
FROM INFORMATION_SCHEMA.TABLES

EXEC (@SQL)
  #8 (permalink)  
Antiguo 30/06/2012, 15:37
 
Fecha de Ingreso: junio-2012
Mensajes: 5
Antigüedad: 11 años, 9 meses
Puntos: 0
Respuesta: Procedimientos almacenados SQL

Gracias Missi

Probé el código y me trae todo tipo de tablas con y sin contendo. Y lo que yo necesito es que los resultados tengan una coincidencia con una cadena de texto.

Y que todo los resultados me los traiga en una sola tabla para poder llevarme los datos a ASP, o en su defecto identificar el nombre de cada tabla.

Muchas gracias por tu ayuda.


iislas, en realidad no sé que está fallando, creo que con SQLServer 2008 tendría que funcionar, no lo sé...

Gracias

Creo que tendré que probar con otras alternativas y abandonar este código.

Etiquetas: procedimiento, procedimientos, server, sql, tabla, almacenar, campos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:10.