SQL Server - buscar numero en toda la base

   
Vista:

buscar numero en toda la base

Publicado por Marcos (4 intervenciones) el 06/09/2017 21:54:15
Estimados, muy buenas tardes
Por favor requiero de su sabiduría...

Dada la necesidad de buscar un texto especifico en toda la base (soy nuevo en el trabajo y no hay documentación de la estructura de la base de datos) , conseguí con un amigo el siguiente procedimiento que funciona a la perfección buscando un texto o parte de un texto en toda la base , pero ahora necesito adaptarlo para que haga la misma función pero buscando un numero en todas las tablas y todos los campos (obviamente no necesito buscar parte del numero sino la coincidencia exacta)

Agradezco de antemano su ayuda .

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
DECLARE @resultados TABLE (columna nvarchar(370), valor nvarchar(3630))
DECLARE @tabla nvarchar(256), @columna nvarchar(128), @cadenaBuscar nvarchar(110)
SET  @tabla = ''
SET @cadenaBuscar = QUOTENAME('%TEXTOABUSCAR%','''')
 
WHILE @tabla IS NOT NULL
    BEGIN
        SET @columna = ''
        SET @tabla =
        (SELECT MIN(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) > @tabla AND OBJECTPROPERTY(OBJECT_ID( QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) ), 'IsMSShipped' ) = 0)
        WHILE (@tabla IS NOT NULL) AND (@columna IS NOT NULL)
            BEGIN
                SET @columna = (SELECT MIN(QUOTENAME(COLUMN_NAME)) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = PARSENAME(@tabla, 2) AND TABLE_NAME = PARSENAME(@tabla, 1) AND DATA_TYPE IN ('char', 'varchar', 'nchar', 'nvarchar') AND QUOTENAME(COLUMN_NAME) > @columna)
                IF @columna IS NOT NULL
                    BEGIN
                        INSERT INTO @resultados
                        EXEC ( 'SELECT ''' + @tabla + '.' + @columna + ''', LEFT(' + @columna + ', 3630) FROM ' + @tabla + ' (NOLOCK) ' + ' WHERE ' + @columna + ' LIKE ' + @cadenaBuscar )
                    END
                END
    END
 
SELECT columna, valor FROM @resultados
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Isaias

buscar numero en toda la base

Publicado por Isaias (3751 intervenciones) el 06/09/2017 22:42:09
Pues deberia ser algo similar

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
DECLARE @SearchStr nvarchar(100) = '1000'
 
DECLARE @Results TABLE(ColumnName nvarchar(370), ColumnValue nvarchar(3630))
 
SET NOCOUNT ON
 
DECLARE @TableName nvarchar(256), @ColumnName nvarchar(128), @SearchStr2 nvarchar(110)
SET  @TableName = ''
SET @SearchStr2 = QUOTENAME('' + @SearchStr + '','''')
 
WHILE @TableName IS NOT NULL
BEGIN
    SET @ColumnName = ''
    SET @TableName =
    (
        SELECT MIN(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME))
        FROM    INFORMATION_SCHEMA.TABLES
        WHERE       TABLE_TYPE = 'BASE TABLE'
            AND QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) > @TableName
            AND OBJECTPROPERTY(
                    OBJECT_ID(
                        QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)
                         ), 'IsMSShipped'
                           ) = 0
    )
 
    WHILE (@TableName IS NOT NULL) AND (@ColumnName IS NOT NULL)
    BEGIN
        SET @ColumnName =
        (
            SELECT MIN(QUOTENAME(COLUMN_NAME))
            FROM    INFORMATION_SCHEMA.COLUMNS
            WHERE       TABLE_SCHEMA    = PARSENAME(@TableName, 2)
                AND TABLE_NAME  = PARSENAME(@TableName, 1)
                AND DATA_TYPE IN ('int', 'bigint', 'decimal', 'float')
                AND QUOTENAME(COLUMN_NAME) > @ColumnName
        )
 
        IF @ColumnName IS NOT NULL
        BEGIN
            INSERT INTO @Results
            EXEC
            (
                'SELECT ''' + @TableName + '.' + @ColumnName + ''', LEFT(' + @ColumnName + ', 3630)
                FROM ' + @TableName + ' (NOLOCK) ' +
                ' WHERE ' + @ColumnName + ' = ' + 'cast('+@SearchStr2 +' as int)'
            )
        END
    END
END
 
SELECT ColumnName, ColumnValue FROM @Results
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

buscar numero en toda la base

Publicado por Marcos (4 intervenciones) el 07/09/2017 12:45:39
MARAVILLOSO...

ISAIAS... muchas gracias... eres un GENIO!!! funciona a la perfeccion
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Isaias

buscar numero en toda la base

Publicado por Isaias (3751 intervenciones) el 07/09/2017 16:32:27
Pues gracias por lo de "Genio", pero no, mi conviccion siempre ha sido, aprender algo nuevo o intentar hacerlo.

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Revisar política de publicidad