Principales respuestas
Obtener en una select el listado de tablas y de columnas de mi base de datos

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_3Muchas gracias.
- Editado Lignou viernes, 15 de diciembre de 2017 21:57 Mejorar la expresión escrita
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
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
-
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é.
- Editado El dudas lunes, 18 de diciembre de 2017 8:26
- Propuesto como respuesta Pablo RubioModerator lunes, 18 de diciembre de 2017 15:47
-
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.
- Editado Pablo RubioModerator lunes, 18 de diciembre de 2017 20:13 revisión