none
Campos vacios en una tabla RRS feed

  • Pregunta

  • Buenos días,

    Necesito saber como puedo con sql 2005, conocer la cantidad de campos vacios o en desuso dentro de una tupla en una tabla,

    ejemplo: yo tengo una tabla de 165 campos, de los cuales a pie, conozco que solo se usan 35 campos, los demás estan vacios o en desuso.

    ese mismo proceso tengo que hacerlo con 975 tablas...

    habrá alguna manera por medio de sql server 2005, para conocer esa descripción,

    Gracias, Saludos,

    Frank Vega

    miércoles, 23 de enero de 2013 15:27

Respuestas

  • Hola.

    Con versiones más recientes, cuentas con más herramientas para el perfilado de tablas (que es lo que necesitas). Con SQL Server 2005 tendrás que prepararlo tú mismo. No es que haya mucha magia en ello, hay que recurrir a las tablas de metadatos (information_schema) para recorrer las columnas de una tabla dada (ojo, no todas, sólo las que admitan valores nulos). Con eso construyes una sentencia que realice los recuentos y que inserte los resultados en una tabla de resumen de cuatro campos (nombre de la tabla, nombre del campo, total de registros, total de nulos para el campo).

    Y lo que haces para una tabla, lo elevas para todas, con otro bucle.

    El núcleo de la sentencia sería algo así:

    --Sentencia a ejecutar
    select
      NombreTabla = 'Tabla',
      NombreCampo = 'campo1',
      NumRegistros = count(*), 
      NumNulos = sum(case when campo1 is null then 1 else 0 end)
    from Tabla with(nolock)
    

    Luego tienes que generar la sentencia que construya eso de forma dinámica. Algo más o menos así:

    declare @sql varchar(max), @Tabla varchar(max), @Campo varchar(max)
    
    --Fijamos una tabla: MiTabla y un campo: Campo1
    select @Tabla = 'MiTabla', @campo = 'Campo1'
    
    select @sql = 'insert TablaRecuentos (NombreTabla, NombreCampo, NumRegistros, NumNumlos)
    '
    
    select @sql = @sql + '
      NombreTabla = ''' + TABLE_NAME + ''',
      NombreCampo = ''' + COLUMN_NAME + ''',
      NumRegistros = count(*),
      NumNulos = sum(case when [' + COLUMN_NAME + '] is null then 1 else 0 end)
    from [' + TABLE_NAME + '] with(nolock)'
    from INFORMATION_SCHEMA.COLUMNS
    WHERE TABLE_NAME = @Tabla and COLUMN_NAME = @Campo
    
    EXEC (@sql)

    Esto lo tienes que ampliar metiendo en un cursor este código, filtrando antes por los campos que no admitan nulos (no hay que calcularlos, puedes preparar una inserción simple para ellos). Cuando lo tengas para todos los campos de una tabla, lo extrapolas para para todas las tablas. Ojo, si tienes varios esquemas, contémplalo también.

    Inténtalo, si no lo logras, nos dices.


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.com
    Sígueme en twitter en http://twitter.com/qwalgrande

    domingo, 27 de enero de 2013 19:04
    Moderador

Todas las respuestas

  • Defina "en desuso".  Luego aplique la definición a cada campo.

    Si "en desuso" significa que el 100% de los registros tienen ese campo nulo, entonces simplemente busque los campos no nulos:

    if (Exists (Select campo from tabla where campo is not null))
    Begin
        --Existe al menos un registro con un campo no nulo.
    Else
        --Todos los registros tienen el campo nulo.
    End

    Si su definición de "en desuso" tiene es distinta entones debe usted explicárnosla para poder ayudarle.


    Jose R. MCP
    Code Samples

    miércoles, 23 de enero de 2013 15:38
  • Hola. Qué significa para ti "campos vacios o en desuso dentro de una tuple en una tabla"? Si puedes explicar, incluso con una imagen el ejemplo que indicas, muchísimo major.

    Gracias y saludos,


    Guillermo Taylor F.
    IT Pro & Xbox gamer
    My blog

    miércoles, 23 de enero de 2013 15:39
  • Gracias por la respuesta....

    el asunto es éste, tengo que analizar casi mil tablas de una base de datos y determinar cuántos campos de cada tabla no contienen del todo datos, o nunca fueron usados.

    Es correcto, significa que en los que expreso como "desuso" el 100% de los registros tiene ese campo nulo vacio.

    Todo lo anterior para realizar un reporte específico y decir... de la tabla "x", de los 30 campos que la conforman, existen 10 (o decir los siguientes 10) nunca fueron utilizados, estan en blanco.

    Saludos,

    Frank Vega

    miércoles, 23 de enero de 2013 16:18
  • Gracias por la respuesta....

    el asunto es éste, tengo que analizar casi mil tablas de una base de datos y determinar cuántos campos de cada tabla no contienen del todo datos, o nunca fueron usados.

    Significa que en los que expreso como "desuso" el 100% de los registros tiene ese campo nulo o vacio.

    Todo lo anterior para realizar un reporte específico y decir... de la tabla "x", de los 30 campos que la conforman, existen 10 (o decir los siguientes 10) nunca fueron utilizados, estan en blanco.

    Saludos,

    Frank Vega

    miércoles, 23 de enero de 2013 16:19
  • Ok, como le dije entonces.

    Jose R. MCP
    Code Samples

    miércoles, 23 de enero de 2013 16:41
  • Gracias...

    una consulta....

    pero con esta clausula, tendría que ir campo por campo, de esta forma.... estoy en lo correcto?

    if (Exists (Select campo1x from tabla where campo1x is not null))
    Begin
       
    --Existe al menos un registro con un campo no nulo.
    Else
       
    --Todos los registros tienen el campo nulo.
    End

    if (Exists (Select campo2x from tabla where campo2x is not null))
    Begin
       
    --Existe al menos un registro con un campo no nulo.
    Else
       
    --Todos los registros tienen el campo nulo.
    End

    como podría evaluar todos los campos en una sola clausula?

    porque son 165 campos en una sola tabla... y son casi 1000 tablas...
    miércoles, 23 de enero de 2013 16:46
  • Hola. Pues si los campos están en NULL, hay que generar un ciclo que recorra las tablas requeridas y genere dicho reporte, trabajando con objetos del esquema SYS como tablas y columnas. Yo hice eso hace algún tiempo pero no tengo el código a la mano... De pronto algún otro forista puede compartir el código mientras llego a la casa esta noche y lo comparto.

    Gracias y saludos,


    Guillermo Taylor F.
    IT Pro & Xbox gamer
    My blog

    miércoles, 23 de enero de 2013 16:47
  • Gracias!

    voy a intentarlo.... pero si me pudieras ayudar más tarde te lo agradecería, mi e-mail es: frankdelavega en hotmail

    miércoles, 23 de enero de 2013 17:01
  • Frank, las respuestas de los expertos son valiosas más allá de resolver el problema de la persona que pregunta.  La respuesta queda aquí para ayudar a más personas en el futuro.  Por lo tanto le rogamos NO solicitar ayuda a través de correo-e porque entonces el foro perdería todo sentido.  Todas las respuestas DEBEN presentarse aquí para obtener el mayor beneficio.

    Jose R. MCP
    Code Samples

    miércoles, 23 de enero de 2013 17:17
  • Gracias....
    miércoles, 23 de enero de 2013 17:56
  • Hola Frank,

    En este vínculo encontrarás la solución a tu problema: http://www.mssqltips.com/sqlservertip/1639/sql-server-2008-sparse-columns-identifying-columns-for-conversion/

    Básicamente es un script que localiza las columnas de las distintas tablas de una BBDD, comprueba el número de registros que existen, y el número de veces que ese campo contiene el valor NULL, y a partir de ambos muestra una tercera columna con el porcentaje de registros de esa columna que contienen el valor NULL. ¡Realmente un script muy útil!

    Espero que te sirva.

    Saludos.


    Ferran Chopo
    MCPD Web, MCITP SQL Server
    Web: http://www.ferranchopo.com Twitter: @fchopo

    miércoles, 23 de enero de 2013 21:57
  • Gracias, por tu ayuda....

    tengo una inquietud...

    como lo diseño para sql server 2005?

    saludos,

    Frank

    jueves, 24 de enero de 2013 14:17
  • Hola.

    Con versiones más recientes, cuentas con más herramientas para el perfilado de tablas (que es lo que necesitas). Con SQL Server 2005 tendrás que prepararlo tú mismo. No es que haya mucha magia en ello, hay que recurrir a las tablas de metadatos (information_schema) para recorrer las columnas de una tabla dada (ojo, no todas, sólo las que admitan valores nulos). Con eso construyes una sentencia que realice los recuentos y que inserte los resultados en una tabla de resumen de cuatro campos (nombre de la tabla, nombre del campo, total de registros, total de nulos para el campo).

    Y lo que haces para una tabla, lo elevas para todas, con otro bucle.

    El núcleo de la sentencia sería algo así:

    --Sentencia a ejecutar
    select
      NombreTabla = 'Tabla',
      NombreCampo = 'campo1',
      NumRegistros = count(*), 
      NumNulos = sum(case when campo1 is null then 1 else 0 end)
    from Tabla with(nolock)
    

    Luego tienes que generar la sentencia que construya eso de forma dinámica. Algo más o menos así:

    declare @sql varchar(max), @Tabla varchar(max), @Campo varchar(max)
    
    --Fijamos una tabla: MiTabla y un campo: Campo1
    select @Tabla = 'MiTabla', @campo = 'Campo1'
    
    select @sql = 'insert TablaRecuentos (NombreTabla, NombreCampo, NumRegistros, NumNumlos)
    '
    
    select @sql = @sql + '
      NombreTabla = ''' + TABLE_NAME + ''',
      NombreCampo = ''' + COLUMN_NAME + ''',
      NumRegistros = count(*),
      NumNulos = sum(case when [' + COLUMN_NAME + '] is null then 1 else 0 end)
    from [' + TABLE_NAME + '] with(nolock)'
    from INFORMATION_SCHEMA.COLUMNS
    WHERE TABLE_NAME = @Tabla and COLUMN_NAME = @Campo
    
    EXEC (@sql)

    Esto lo tienes que ampliar metiendo en un cursor este código, filtrando antes por los campos que no admitan nulos (no hay que calcularlos, puedes preparar una inserción simple para ellos). Cuando lo tengas para todos los campos de una tabla, lo extrapolas para para todas las tablas. Ojo, si tienes varios esquemas, contémplalo también.

    Inténtalo, si no lo logras, nos dices.


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.com
    Sígueme en twitter en http://twitter.com/qwalgrande

    domingo, 27 de enero de 2013 19:04
    Moderador