Las siguientes consultas se pueden utilizar para la generación de diccionario de datos en SQL Server.
- Lista de tablas, descripción y cantidad de registros
- Lista de vistas y descripción
- Lista de campos y descripción
- Lista de llaves foráneas
- Lista de vistas, columnas y descripción
- Numero de columnas por tablas
- Lista de indices
1. Lista de tablas, descripción y cantidad de registros
SELECT SCHEMA_NAME(TAB.SCHEMA_ID) AS SCHEMA_NAME,
TAB.NAME AS TABLE_NAME,
TAB.CREATE_DATE AS CREATED,
TAB.MODIFY_DATE AS LAST_MODIFIED,
P.ROWS AS NUM_ROWS,
EP.VALUE AS COMMENTS
FROM SYS.TABLES TAB
INNER JOIN (SELECT DISTINCT P.OBJECT_ID, SUM(P.ROWS) ROWS
FROM SYS.TABLES T
INNER JOIN SYS.PARTITIONS P ON P.OBJECT_ID = T.OBJECT_ID
GROUP BY P.OBJECT_ID, P.INDEX_ID) P
ON P.OBJECT_ID = TAB.OBJECT_ID
LEFT JOIN SYS.EXTENDED_PROPERTIES EP
ON TAB.OBJECT_ID = EP.MAJOR_ID
AND EP.NAME = 'MS_DESCRIPTION'
AND EP.MINOR_ID = 0
AND EP.CLASS_DESC = 'OBJECT_OR_COLUMN'
ORDER BY SCHEMA_NAME,
TABLE_NAME;

2. Lista de vistas y descripción
SELECT SCHEMA_NAME(V.SCHEMA_ID) AS SCHEMA_NAME,
V.NAME AS VIEW_NAME,
V.CREATE_DATE AS CREATED,
V.MODIFY_DATE AS LAST_MODIFIED,
M.DEFINITION,
EP.VALUE AS COMMENTS
FROM SYS.VIEWS V
LEFT JOIN SYS.EXTENDED_PROPERTIES EP
ON V.OBJECT_ID = EP.MAJOR_ID
AND EP.NAME = 'MS_DESCRIPTION'
AND EP.MINOR_ID = 0
AND EP.CLASS_DESC = 'OBJECT_OR_COLUMN'
INNER JOIN SYS.SQL_MODULES M
ON M.OBJECT_ID = V.OBJECT_ID
ORDER BY SCHEMA_NAME,
VIEW_NAME;

3. Lista de campos y descripción
SELECT SCHEMA_NAME(TAB.SCHEMA_ID) AS SCHEMA_NAME,
TAB.NAME AS TABLE_NAME,
COL.NAME AS COLUMN_NAME,
T.NAME AS DATA_TYPE,
T.NAME +
CASE WHEN T.IS_USER_DEFINED = 0 THEN
ISNULL('(' +
CASE WHEN T.NAME IN ('BINARY', 'CHAR', 'NCHAR',
'VARCHAR', 'NVARCHAR', 'VARBINARY') THEN
CASE COL.MAX_LENGTH
WHEN -1 THEN 'MAX'
ELSE
CASE WHEN T.NAME IN ('NCHAR',
'NVARCHAR') THEN
CAST(COL.MAX_LENGTH/2
AS VARCHAR(4))
ELSE CAST(COL.MAX_LENGTH
AS VARCHAR(4))
END
END
WHEN T.NAME IN ('DATETIME2', 'DATETIMEOFFSET',
'TIME') THEN
CAST(COL.SCALE AS VARCHAR(4))
WHEN T.NAME IN ('DECIMAL', 'NUMERIC') THEN
CAST(COL.PRECISION AS VARCHAR(4)) + ', ' +
CAST(COL.SCALE AS VARCHAR(4))
END + ')', '')
ELSE ':' +
(SELECT C_T.NAME +
ISNULL('(' +
CASE WHEN C_T.NAME IN ('BINARY', 'CHAR',
'NCHAR', 'VARCHAR', 'NVARCHAR',
'VARBINARY') THEN
CASE C.MAX_LENGTH
WHEN -1 THEN 'MAX'
ELSE
CASE WHEN T.NAME IN
('NCHAR',
'NVARCHAR') THEN
CAST(C.MAX_LENGTH/2
AS VARCHAR(4))
ELSE CAST(C.MAX_LENGTH
AS VARCHAR(4))
END
END
WHEN C_T.NAME IN ('DATETIME2',
'DATETIMEOFFSET', 'TIME') THEN
CAST(C.SCALE AS VARCHAR(4))
WHEN C_T.NAME IN ('DECIMAL', 'NUMERIC') THEN
CAST(C.PRECISION AS VARCHAR(4)) + ', '
+ CAST(C.SCALE AS VARCHAR(4))
END + ')', '')
FROM SYS.COLUMNS AS C
INNER JOIN SYS.TYPES AS C_T
ON C.SYSTEM_TYPE_ID = C_T.USER_TYPE_ID
WHERE C.OBJECT_ID = COL.OBJECT_ID
AND C.COLUMN_ID = COL.COLUMN_ID
AND C.USER_TYPE_ID = COL.USER_TYPE_ID
)
END AS DATA_TYPE_EXT,
CASE WHEN COL.IS_NULLABLE = 0 THEN 'N'
ELSE 'Y' END AS NULLABLE,
CASE WHEN DEF.DEFINITION IS NOT NULL THEN DEF.DEFINITION
ELSE '' END AS DEFAULT_VALUE,
CASE WHEN PK.COLUMN_ID IS NOT NULL THEN 'PK'
ELSE '' END AS PRIMARY_KEY,
CASE WHEN FK.PARENT_COLUMN_ID IS NOT NULL THEN 'FK'
ELSE '' END AS FOREIGN_KEY,
CASE WHEN UK.COLUMN_ID IS NOT NULL THEN 'UK'
ELSE '' END AS UNIQUE_KEY,
CASE WHEN CH.CHECK_CONST IS NOT NULL THEN CH.CHECK_CONST
ELSE '' END AS CHECK_CONTRAINT,
CC.DEFINITION AS COMPUTED_COLUMN_DEFINITION,
EP.VALUE AS COMMENTS
FROM SYS.TABLES AS TAB
LEFT JOIN SYS.COLUMNS AS COL
ON TAB.OBJECT_ID = COL.OBJECT_ID
LEFT JOIN SYS.TYPES AS T
ON COL.USER_TYPE_ID = T.USER_TYPE_ID
LEFT JOIN SYS.DEFAULT_CONSTRAINTS AS DEF
ON DEF.OBJECT_ID = COL.DEFAULT_OBJECT_ID
LEFT JOIN (
SELECT INDEX_COLUMNS.OBJECT_ID,
INDEX_COLUMNS.COLUMN_ID
FROM SYS.INDEX_COLUMNS
INNER JOIN SYS.INDEXES
ON INDEX_COLUMNS.OBJECT_ID = INDEXES.OBJECT_ID
AND INDEX_COLUMNS.INDEX_ID = INDEXES.INDEX_ID
WHERE INDEXES.IS_PRIMARY_KEY = 1
) AS PK
ON COL.OBJECT_ID = PK.OBJECT_ID
AND COL.COLUMN_ID = PK.COLUMN_ID
LEFT JOIN (
SELECT FC.PARENT_COLUMN_ID,
FC.PARENT_OBJECT_ID
FROM SYS.FOREIGN_KEYS AS F
INNER JOIN SYS.FOREIGN_KEY_COLUMNS AS FC
ON F.OBJECT_ID = FC.CONSTRAINT_OBJECT_ID
GROUP BY FC.PARENT_COLUMN_ID, FC.PARENT_OBJECT_ID
) AS FK
ON FK.PARENT_OBJECT_ID = COL.OBJECT_ID
AND FK.PARENT_COLUMN_ID = COL.COLUMN_ID
LEFT JOIN (
SELECT C.PARENT_COLUMN_ID,
C.PARENT_OBJECT_ID,
'CHECK' CHECK_CONST
FROM SYS.CHECK_CONSTRAINTS AS C
GROUP BY C.PARENT_COLUMN_ID,
C.PARENT_OBJECT_ID
) AS CH
ON COL.COLUMN_ID = CH.PARENT_COLUMN_ID
AND COL.OBJECT_ID = CH.PARENT_OBJECT_ID
LEFT JOIN (
SELECT INDEX_COLUMNS.OBJECT_ID,
INDEX_COLUMNS.COLUMN_ID
FROM SYS.INDEX_COLUMNS
INNER JOIN SYS.INDEXES
ON INDEXES.INDEX_ID = INDEX_COLUMNS.INDEX_ID
AND INDEXES.OBJECT_ID = INDEX_COLUMNS.OBJECT_ID
WHERE INDEXES.IS_UNIQUE_CONSTRAINT = 1
GROUP BY INDEX_COLUMNS.OBJECT_ID,
INDEX_COLUMNS.COLUMN_ID
) AS UK
ON COL.COLUMN_ID = UK.COLUMN_ID
AND COL.OBJECT_ID = UK.OBJECT_ID
LEFT JOIN SYS.EXTENDED_PROPERTIES AS EP
ON TAB.OBJECT_ID = EP.MAJOR_ID
AND COL.COLUMN_ID = EP.MINOR_ID
AND EP.NAME = 'MS_DESCRIPTION'
AND EP.CLASS_DESC = 'OBJECT_OR_COLUMN'
LEFT JOIN SYS.COMPUTED_COLUMNS AS CC
ON TAB.OBJECT_ID = CC.OBJECT_ID
AND COL.COLUMN_ID = CC.COLUMN_ID
ORDER BY SCHEMA_NAME,
TABLE_NAME,
COLUMN_NAME;

4. Lista de llaves foráneas
SELECT SCHEMA_NAME(TAB.SCHEMA_ID) AS TABLE_SCHEMA_NAME,
TAB.NAME AS TABLE_NAME,
COL.NAME AS COLUMN_NAME,
FK.NAME AS CONSTRAINT_NAME,
SCHEMA_NAME(TAB_PRIM.SCHEMA_ID) AS PRIMARY_TABLE_SCHEMA_NAME,
TAB_PRIM.NAME AS PRIMARY_TABLE_NAME,
COL_PRIM.NAME AS PRIMARY_TABLE_COLUMN,
SCHEMA_NAME(TAB.SCHEMA_ID) + '.' + TAB.NAME + '.' +
COL.NAME + ' = ' + SCHEMA_NAME(TAB_PRIM.SCHEMA_ID) + '.' +
TAB_PRIM.NAME + '.' + COL_PRIM.NAME AS JOIN_CONDITION,
CASE
WHEN COUNT(*) OVER (PARTITION BY FK.NAME) = 1 THEN 'Y'
ELSE 'N'
END AS COMPLEX_FK,
FKC.CONSTRAINT_COLUMN_ID AS FK_PART
FROM SYS.TABLES AS TAB
INNER JOIN SYS.FOREIGN_KEYS AS FK
ON TAB.OBJECT_ID = FK.PARENT_OBJECT_ID
INNER JOIN SYS.FOREIGN_KEY_COLUMNS AS FKC
ON FK.OBJECT_ID = FKC.CONSTRAINT_OBJECT_ID
INNER JOIN SYS.COLUMNS AS COL
ON FKC.PARENT_OBJECT_ID = COL.OBJECT_ID
AND FKC.PARENT_COLUMN_ID = COL.COLUMN_ID
INNER JOIN SYS.COLUMNS AS COL_PRIM
ON FKC.REFERENCED_OBJECT_ID = COL_PRIM.OBJECT_ID
AND FKC.REFERENCED_COLUMN_ID = COL_PRIM.COLUMN_ID
INNER JOIN SYS.TABLES AS TAB_PRIM
ON FK.REFERENCED_OBJECT_ID = TAB_PRIM.OBJECT_ID
ORDER BY TABLE_SCHEMA_NAME,
TABLE_NAME,
PRIMARY_TABLE_NAME,
FK_PART;

5. Lista de vistas, columnas y descripción
SELECT SCHEMA_NAME(V.SCHEMA_ID) AS SCHEMA_NAME,
V.NAME AS VIEW_NAME,
COL.NAME AS COLUMN_NAME,
T.NAME AS DATA_TYPE,
T.NAME +
CASE WHEN T.IS_USER_DEFINED = 0 THEN
ISNULL('(' +
CASE WHEN T.NAME IN ('BINARY', 'CHAR', 'NCHAR',
'VARCHAR', 'NVARCHAR', 'VARBINARY') THEN
CASE COL.MAX_LENGTH
WHEN -1 THEN 'MAX'
ELSE
CASE
WHEN T.NAME IN ('NCHAR',
'NVARCHAR') THEN
CAST(COL.MAX_LENGTH/2
AS VARCHAR(4))
ELSE CAST(COL.MAX_LENGTH
AS VARCHAR(4))
END
END
WHEN T.NAME IN ('DATETIME2',
'DATETIMEOFFSET', 'TIME') THEN
CAST(COL.SCALE AS VARCHAR(4))
WHEN T.NAME IN ('DECIMAL', 'NUMERIC') THEN
CAST(COL.PRECISION AS VARCHAR(4)) + ', ' +
CAST(COL.SCALE AS VARCHAR(4))
END + ')', '')
ELSE ':' +
(SELECT C_T.NAME +
ISNULL('(' +
CASE WHEN C_T.NAME IN ('BINARY', 'CHAR',
'NCHAR', 'VARCHAR', 'NVARCHAR',
'VARBINARY') THEN
CASE C.MAX_LENGTH
WHEN -1 THEN 'MAX'
ELSE CASE WHEN T.NAME IN
('NCHAR',
'NVARCHAR')
THEN CAST(C.MAX_LENGTH/2
AS VARCHAR(4))
ELSE CAST(C.MAX_LENGTH
AS VARCHAR(4))
END
END
WHEN C_T.NAME IN ('DATETIME2',
'DATETIMEOFFSET', 'TIME') THEN
CAST(C.SCALE AS VARCHAR(4))
WHEN C_T.NAME IN ('DECIMAL', 'NUMERIC') THEN
CAST(C.PRECISION AS VARCHAR(4)) +
', ' + CAST(C.SCALE AS VARCHAR(4))
END + ')', '')
FROM SYS.COLUMNS AS C
INNER JOIN SYS.TYPES AS C_T
ON C.SYSTEM_TYPE_ID = C_T.USER_TYPE_ID
WHERE C.OBJECT_ID = COL.OBJECT_ID
AND C.COLUMN_ID = COL.COLUMN_ID
AND C.USER_TYPE_ID = COL.USER_TYPE_ID
)
END AS DATA_TYPE_EXT,
CASE WHEN COL.IS_NULLABLE = 0 THEN 'N' ELSE 'Y' END AS NULLABLE,
EP.VALUE AS COMMENTS
FROM SYS.VIEWS AS V
JOIN SYS.COLUMNS AS COL
ON V.OBJECT_ID = COL.OBJECT_ID
LEFT JOIN SYS.TYPES AS T
ON COL.USER_TYPE_ID = T.USER_TYPE_ID
LEFT JOIN SYS.EXTENDED_PROPERTIES AS EP
ON V.OBJECT_ID = EP.MAJOR_ID
AND COL.COLUMN_ID = EP.MINOR_ID
AND EP.NAME = 'MS_DESCRIPTION'
AND EP.CLASS_DESC = 'OBJECT_OR_COLUMN'
ORDER BY SCHEMA_NAME,
VIEW_NAME,
COLUMN_NAME;

6. Número de columnas por tablas
SELECT SCHEMA_NAME(TAB.SCHEMA_ID) AS SCHEMA_NAME,
TAB.NAME AS TABLE_NAME,
COUNT(*) AS COLUMNS
FROM SYS.TABLES AS TAB
INNER JOIN SYS.COLUMNS AS COL
ON TAB.OBJECT_ID = COL.OBJECT_ID
GROUP BY SCHEMA_NAME(TAB.SCHEMA_ID),
TAB.NAME
ORDER BY COUNT(*) DESC;

7. Lista de indices
SELECT
TABLENAME = T.NAME,
INDEXNAME = IND.NAME,
INDEXID = IND.INDEX_ID,
COLUMNID = IC.INDEX_COLUMN_ID,
COLUMNNAME = COL.NAME,
IND.*,
IC.*,
COL.*
FROM
SYS.INDEXES IND
INNER JOIN
SYS.INDEX_COLUMNS IC ON IND.OBJECT_ID = IC.OBJECT_ID AND IND.INDEX_ID = IC.INDEX_ID
INNER JOIN
SYS.COLUMNS COL ON IC.OBJECT_ID = COL.OBJECT_ID AND IC.COLUMN_ID = COL.COLUMN_ID
INNER JOIN
SYS.TABLES T ON IND.OBJECT_ID = T.OBJECT_ID
WHERE
IND.IS_PRIMARY_KEY = 0
AND IND.IS_UNIQUE = 0
AND IND.IS_UNIQUE_CONSTRAINT = 0
AND T.IS_MS_SHIPPED = 0
ORDER BY
T.NAME, IND.NAME, IND.INDEX_ID, IC.INDEX_COLUMN_ID;
