none
Obtener en una select el listado de tablas y de columnas de mi base de datos RRS feed

  • Pregunta

  • Buenos días, estoy intentando conseguir obtener el listado de tablas que tengo y los campos correspondientes a cada tabla en un único registro donde en la primera campo apareciese el nombre de la tabla y en el segundo apareciese la concatenanción de los campos que tiene esa tabla, separados por comas

    Ejemplo si tengo en la BD 2 tablas: Tabla_1 y Tabla_2

    Tabla_1 tiene los campos: CT1_1 y CT1_2

    Tabla_2 tiene los campos: CT2_1, CT2_2 y CT2_3

    Al realizar la consulta mostrará

    Tabla_1         CT1_1, CT1_2

    Tabla_2         CT2_1, CT2_2, CT2_3

    Por ahora mediante esta consulta:

    --Muestra las columnas de la tabla especificada en orden alfabético.
    SELECT T.name as [Nombre de Tabla], C.name as [Nombre de campo]
    FROM sys.columns AS C WITH(NOLOCK)
    INNER JOIN sys.tables AS T WITH(NOLOCK) ON C.object_id = T.object_id
    WHERE T.name in ('Tabla_1', 'Tabla_2')
    ORDER BY 1, 2 ASC 

    ------------------------------------------------

    Nombre de Tabla Nombre de campo

    ------------------------------------------------

    Tabla_1                         CT1_1
    Tabla_1                         CT1_2
    Tabla_2                         CT2_1
    Tabla_2                         CT2_2
    Tabla_2                         CT2_3

    ¿Sabéis alguna consulta? para que se muestre como muestro más abajo.

    ------------------------------------------------

    Nombre de Tabla Nombre de campo

    ------------------------------------------------

    Tabla_1                         CT1_1, CT1_2
    Tabla_2                         CT2_1, CT2_2,  CT2_3

    Muchas gracias.


    • Editado Lignou viernes, 15 de diciembre de 2017 21:57 Mejorar la expresión escrita
    viernes, 15 de diciembre de 2017 21:54

Respuestas

  • Anda he conseguido resolverlo dejo la solución que he utilizado.

    SELECT T.name as [Nombre de Tabla]
    	,stuff((
    			SELECT ', ' + C.name
    			FROM sys.columns AS C WITH(NOLOCK)
    			INNER JOIN sys.tables AS TA WITH(NOLOCK) ON C.object_id = TA.object_id
    			WHERE T.name  = TA.name 
    			AND  TA.name in ('Tabla_1', 'Tabla_2')
    			FOR XML PATH('')
    			), 1, 1, '') [Nombre de campo]
    FROM  sys.tables AS T WITH(NOLOCK)
    GROUP BY T.name
    ORDER BY 1,2 ASC

    ------------------------------------------------

    Nombre de Tabla Nombre de campo

    ------------------------------------------------

    Tabla_1                         CT1_1, CT1_2
    Tabla_2                         CT2_1, CT2_2,  CT2_3

    ¿Alguien sabe como hacer lo mismo pero en vez de pasarle un listado (TA.name in ('Clientes', 'TABLE_1'))hacerlo con todas las tablas de mi base de datos? sin especificar las tablas.


    • Marcado como respuesta Lignou viernes, 15 de diciembre de 2017 22:29
    viernes, 15 de diciembre de 2017 22:29

Todas las respuestas

  • Anda he conseguido resolverlo dejo la solución que he utilizado.

    SELECT T.name as [Nombre de Tabla]
    	,stuff((
    			SELECT ', ' + C.name
    			FROM sys.columns AS C WITH(NOLOCK)
    			INNER JOIN sys.tables AS TA WITH(NOLOCK) ON C.object_id = TA.object_id
    			WHERE T.name  = TA.name 
    			AND  TA.name in ('Tabla_1', 'Tabla_2')
    			FOR XML PATH('')
    			), 1, 1, '') [Nombre de campo]
    FROM  sys.tables AS T WITH(NOLOCK)
    GROUP BY T.name
    ORDER BY 1,2 ASC

    ------------------------------------------------

    Nombre de Tabla Nombre de campo

    ------------------------------------------------

    Tabla_1                         CT1_1, CT1_2
    Tabla_2                         CT2_1, CT2_2,  CT2_3

    ¿Alguien sabe como hacer lo mismo pero en vez de pasarle un listado (TA.name in ('Clientes', 'TABLE_1'))hacerlo con todas las tablas de mi base de datos? sin especificar las tablas.


    • Marcado como respuesta Lignou viernes, 15 de diciembre de 2017 22:29
    viernes, 15 de diciembre de 2017 22:29
  • Esa solución que dices

    SELECT T.name as [Nombre de Tabla]
    	,stuff((
    			SELECT ', ' + C.name
    			FROM sys.columns AS C WITH(NOLOCK)
    			INNER JOIN sys.tables AS TA WITH(NOLOCK) ON C.object_id = TA.object_id
    			WHERE T.name  = TA.name 
    			AND  TA.name in ('Tabla_1', 'Tabla_2')
    			FOR XML PATH('')
    			), 1, 1, '') [Nombre de campo]
    FROM  sys.tables AS T WITH(NOLOCK)
    GROUP BY T.name
    ORDER BY 1,2 ASC

    NO es correcta.

    En realidad sería así:

    SELECT T.name as [Nombre de Tabla]
    	,stuff((
    			SELECT ', ' + C.name
    			FROM sys.columns AS C WITH(NOLOCK)
    			INNER JOIN sys.tables AS TA WITH(NOLOCK) ON C.object_id = TA.object_id
    			WHERE T.name  = TA.name 
    			AND  TA.name in ('Tabla_1', 'Tabla_2')
    			FOR XML PATH('')
    			), 1, 1, '') [Nombre de campo]
    FROM  sys.tables AS T WITH(NOLOCK)
    where 
    	T.name in ('Tabla_1', 'Tabla_2')
    GROUP BY T.name
    ORDER BY 1,2 ASC
     Respecto a tu otra pregunta:

    ¿Alguien sabe como hacer lo mismo pero en vez de pasarle un listado (TA.name in ('Clientes', 'TABLE_1'))hacerlo con todas las tablas de mi base de datos? sin especificar las tablas

    No lo sé.

    lunes, 18 de diciembre de 2017 8:25
  • Hola Lignou

    De acuerdo a  tu consulta, puedes obtener el catálogo de las bases de datos  de tu SQL. Con esto puedes obtener el número y nombre de las tablas y vistas de las bases de datos, número de columnas  de una tabla o vista, junto con el nombre, tipo de datos, escala, etc.

    El siguiente ejemplo expone lo anterior:

    SELECT name AS object_name
      ,SCHEMA_NAME(schema_id) AS schema_name
      ,type_desc
      ,create_date
      ,modify_date
    FROM sys.objects
    WHERE modify_date > GETDATE() - 10
    ORDER BY modify_date;

    Para más información te recomiendo ir al siguiente enlace que te puede ser muy útil a futuro.

    https://technet.microsoft.com/es-es/library/ms189082(v=sql.105).aspx

    Quedamos al pendiente de cualquier actualización de tu parte.

    Saludos Cordiales.

    Gracias por usar los foros de MSDN.

    Pablo Rubio
     _____

    QuedaMicrosoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft.  

    Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft.


    lunes, 18 de diciembre de 2017 20:12
    Moderador