SQL Server - buscar numero en toda la base

 
Vista:
sin imagen de perfil
Val: 6
Ha aumentado su posición en 7 puestos en SQL Server (en relación al último mes)
Gráfica de SQL Server

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
Val: 1.898
Oro
Ha mantenido su posición en SQL Server (en relación al último mes)
Gráfica de SQL Server

buscar numero en toda la base

Publicado por Isaias (3808 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
sin imagen de perfil
Val: 6
Ha aumentado su posición en 7 puestos en SQL Server (en relación al último mes)
Gráfica de SQL Server

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
Val: 1.898
Oro
Ha mantenido su posición en SQL Server (en relación al último mes)
Gráfica de SQL Server

buscar numero en toda la base

Publicado por Isaias (3808 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