UNIVERSIDAD NACIONAL TECNOLÓGICA DE LIMA SUR
FACULTAD DE INGENIERÍA Y GESTIÓN
ESCUELA PROFESIONAL DE INGENIERÍA DE SISTEMAS
TAREA - ANÁLISIS “DICCIONARIO DE DATOS”
CURSO:
GESTIÓN DE BASE DE DATOS
DOCENTE:
Blas Rebaza, Maruja Emelita
ALUMNO:
Tafur Meneses Andy, CÓDIGO 2113110182
Villa El Salvador
2023
El código a analizar es el siguiente:
USE Matricula;
SELECT
d.object_id,
a.name [table], -- Identificará la Tabla
b.name [column], -- Identificará la columna
c.name [type], -- Identificará el Tipo
CASE -- Recibe el tipo de columna
-- Cuando c es 'numeric', 'decimal', o 'float', entonces se precisa el número
WHEN c.name = 'numeric' OR c.name = 'decimal' OR c.name = 'float' THEN b.precision
ELSE NULL
END [Precision],
-- Recibe el tamaño máximo de b
b.max_length,
CASE -- Recibe si la columna acepta nulos
WHEN b.is_nullable = 0 THEN 'NO'
ELSE 'SI'
END [Permite Nulos],
CASE -- Recibe si la columna es identity (autoincrementable)
WHEN b.is_identity = 0 THEN 'NO'
ELSE 'SI'
END [Es Autonumérico],
ep.value [Descripción], -- Recibe la descripción de la columna (si la hay)
f.ForeignKey, -- Recibe si es llave foránea
f.ReferenceTableName, -- Recibe la referencia de la tabla
f.ReferenceColumnName -- Recibe la referencia de la columna
FROM sys.tables a
-- // Selecciona y muestra toda la información 
INNER JOIN sys.columns b ON a.object_id = b.object_id
INNER JOIN sys.systypes c ON b.system_type_id = c.xtype
INNER JOIN sys.objects d ON a.object_id = d.object_id
LEFT JOIN sys.extended_properties ep ON d.object_id = ep.major_id AND b.column_Id =
ep.minor_id
LEFT JOIN (
SELECT
f.name AS ForeignKey,
OBJECT_NAME(f.parent_object_id) AS TableName,
COL_NAME(fc.parent_object_id, fc.parent_column_id) AS ColumnName,
OBJECT_NAME(f.referenced_object_id) AS ReferenceTableName,
COL_NAME(fc.referenced_object_id, fc.referenced_column_id) AS
ReferenceColumnName
FROM sys.foreign_keys AS f
INNER JOIN sys.foreign_key_columns AS fc ON f.OBJECT_ID = fc.constraint_object_id
) f ON f.TableName = a.name AND f.ColumnName = b.name
WHERE a.name <> 'sysdiagrams'
ORDER BY a.name, b.column_Id;
Al correr el código tenemos:
El código que mostré se utiliza para extraer información sobre las estructuras de las tablas y
columnas dentro de la base de datos "Matricula" en un servidor SQL Server. Puede ser
utilizado para obtener detalles como nombres de tablas, nombres de columnas, tipos de
datos, restricciones, propiedades de las columnas, entre otros aspectos relacionados con la
base de datos.
Explicación:
use Matricula
La instrucción "use …" es una declaración SQL que se utiliza para seleccionar una
base de datos específica; esto es útil cuando trabajas con múltiples bases de datos
en un servidor de SQL Server y necesitas indicar en cuál de ellas deseas ejecutar tus
consultas y comandos. En este caso, "Matricula" es el nombre de la base de datos
que se desea utilizar.
select
d.object_id,
a.name [table],
b.name [column],
c.name [type],
La sentencia "select" trabaja con varias tablas y vistas del sistema para recuperar
información específica sobre las tablas y columnas en la base de datos "Matricula";
trabaja en conjunto con "FROM sys.tables a", esto lo veremos más adelante.
La tabla 'a' hace referencia a la vista del sistema 'sys.tables', la cual almacena
información acerca de todas las tablas en la base de datos. 'a.name' se refiere a la
columna 'name' de la vista 'a', que contiene los nombres de todas las tablas. El alias
'[table]' se utiliza para renombrar la columna 'name'.
La tabla 'b' hace referencia a la vista del sistema 'sys.columns', que contiene
información sobre las columnas de todas las tablas en la base de datos. 'b.name' se
refiere a la columna 'name' de la vista 'b', que almacena los nombres de las
columnas. El alias '[column]' se utiliza para renombrar la columna 'name'.
La tabla 'c' se refiere a la vista del sistema 'sys.systypes', que contiene información
sobre los tipos de datos utilizados en las columnas de las tablas de la base de
datos. 'c.name' se refiere a la columna 'name' de la vista 'c', que almacena los
nombres de los tipos de datos. El alias '[type]' se renombrar la columna 'name'.
La tabla 'd' hace referencia a la vista del sistema 'sys.objects', que contiene
información sobre diversos objetos en la base de datos. 'object_id' es un
identificador único que se asocia a cada objeto en la base de datos. No se utiliza
necesariamente para identificar objetos específicos en la consulta, sino que se
incluye en los resultados de la consulta como parte de la información relacionada
con las tablas y columnas.
CASE
WHEN c.name = 'numeric' OR c.name = 'decimal' OR c.name = 'float' THEN b.precision
ELSE null
END [Precision],
Se coloca "CASE" al iniciar evaluaciones condicionales en SQL.
Con "WHEN c.name = 'numeric' OR c.name = 'decimal' OR c.name = 'float'" se
establece una condición. Si el valor de "c.name" es igual a "numeric," o igual a
"decimal," o igual a "float," entonces la condición se cumple. Esto significa que
estamos buscando columnas que tengan tipos de dato numéricos o de punto
flotante.
Con "THEN b.precision", si la condición es verdadera se tomará la acción
especificada después de "THEN". En este caso, la acción es devolver el valor de
b.precision, que es la precisión de la columna. La precisión generalmente se refiere
a la cantidad de dígitos que pueden almacenarse en la columna para los tipos de
datos numéricos y de punto flotante.
Con "ELSE null", si la condición no se cumple entonces se utiliza NULL, que es un
valor especial en SQL que indica la ausencia de un valor concreto.
Se coloca "END" para finalizar la expresión "CASE" y, en este caso, se le asigna un
alias "[Precision]" al resultado.
b.max_length,
Como ya sabemos, la tabla 'b' hace referencia a la vista del sistema 'sys.columns',
que contiene información sobre las columnas de todas las tablas en la base de
datos. 'b.max_length' se refiere a la columna 'max_length' de la vista 'b'; este campo
almacena información sobre la longitud máxima permitida para las columnas de
tipos de datos de caracteres, como char o varchar.
CASE
WHEN b.is_nullable = 0 THEN 'NO'
ELSE 'SI'
END [Permite Nulls],
Como sabemos, se coloca "CASE" al iniciar evaluaciones condicionales en SQL.
En "WHEN b.is_nullable = 0 THEN 'NO'", "WHEN" se encarga de establecer la
condición como tal; en "b.is_nullable = 0" notamos que el campo "is_nullable" es un
campo de "b", o sea de la vista "sys.columns", y se utiliza para indicar si una columna
permite valores nulos. Si "is_nullable" es igual a 0, significa que la columna no
permite valores nulos.
"THEN" se ejecuta si la condición "WHEN" es verdadera, y se devuelve la cadena de
texto 'NO'. Esto indica que no se permiten valores nulos en la columna.
"ELSE" se ejecuta si la condición "WHEN" no se cumple, y se devuelve la cadena de
texto 'SI'. Esto indica que se permiten valores nulos en la columna.
Como sabemos, se coloca "END" para finalizar la expresión "CASE" y, en este caso,
se le asigna un alias "[Permite Nulls]" al resultado.
CASE
WHEN b.is_identity = 0 THEN 'NO'
ELSE 'SI'
END [Es Autonumerico],
Como sabemos, se coloca "CASE" al iniciar evaluaciones condicionales en SQL.
En "WHEN b.is_identity = 0 THEN 'NO'", "WHEN" se encarga de establecer la
condición como tal; en "b.is_identity" notamos que el campo "is_identity" es un
campo de "b", es decir, de la vista "sys.columns", y se utiliza para indicar si la
columna es una columna de identidad (también conocida como columna
autoincrementable). Si "is_identity" es igual a 0, significa que la columna no es una
columna de identidad.
"THEN" se ejecuta si la condición "WHEN" es verdadera, y se devuelve la cadena de
texto 'NO'. Esto indica que la columna no es una columna de identidad (no es
autoincrementable).
"ELSE" se ejecuta si la condición "WHEN" no se cumple, y se devuelve la cadena de
texto 'SI'. Esto indica que la columna es una columna de identidad (es
autoincrementable).
Como sabemos, se coloca "END" para finalizar la expresión "CASE" y, en este caso,
se le asigna un alias "[Es Autonumerico]" al resultado.
ep.value [Descripcion],
En esta parte de la consulta, "ep.value" se utiliza para obtener el valor asociado con
una propiedad extendida (extended property) de una columna. Esta propiedad
extendida generalmente se utiliza para almacenar una descripción o comentario
adicional relacionado con la columna.
Una "descripción" se refiere a una explicación o comentario adicional que se adjunta a
la columna para proporcionar información adicional sobre su propósito o contenido.
Esta descripción no afecta directamente a los datos almacenados en la columna, pero
puede ser útil para los usuarios y los desarrolladores que trabajan con la base de datos
para comprender mejor la estructura y el significado de la columna.
Finalmente, el alias [Descripcion] se asigna a este valor recuperado en los resultados
de la consulta.
f.ForeignKey,
f.ReferenceTableName,
f.ReferenceColumnName
"f.ForeignKey": Indica si la columna es una clave foránea (foreign key).
"f.ReferenceTableName": Muestra el nombre de la tabla a la que la columna hace
referencia en caso de ser clave foránea.
"f.ReferenceColumnName": Muestra el nombre de la columna de la tabla de referencia
a la que la columna actual se relaciona si es clave foránea.
Pequeña ilustración de la diferencia entre llave primaria (primary key) y llave foránea
(foreign key):
FROM sys.tables a
La cláusula "FROM" se utiliza para especificar la(s) tabla(s) de las cuales deseas
recuperar datos. Es decir, defines las fuentes de datos que se utilizarán en la
consulta.
Como sabemos, "sys.tables" es una tabla del sistema en SQL Server que almacena
información sobre todas las tablas de la base de datos actual, como sus nombres,
identificadores únicos de objetos (object_id), esquemas, fechas de creación y otras
propiedades.
"a" es un alias que se utiliza para hacer referencia a la tabla "sys.tables" dentro de la
consulta.
inner join sys.columns b on a.object_id= b.object_id
inner join sys.systypes c on b.system_type_id= c.xtype
inner join sys.objects d on a.object_id= d.object_id
LEFT JOIN sys.extended_properties ep ON d.object_id = ep.major_id AND
b.column_Id = ep.minor_id
LEFT JOIN (
SELECT
f.name AS ForeignKey,
OBJECT_NAME (f.parent_object_id) AS TableName,
COL_NAME (fc.parent_object_id,fc.parent_column_id) AS
ColumnName,
OBJECT_NAME (f.referenced_object_id) AS ReferenceTableName,
COL_NAME (fc.referenced_object_id,fc.referenced_column_id) AS
ReferenceColumnName
FROM sys.foreign_keys AS f
INNER JOIN sys.foreign_key_columns AS fc ON f.OBJECT_ID =
fc.constraint_object_id) f ON f.TableName =a.name AND f.ColumnName =b.name
Las operaciones "INNER JOIN" se utilizan para combinar datos de varias vistas del
sistema.
En "INNER JOIN sys.columns b ON a.object_id = b.object_id", "INNER JOIN" relaciona
la tabla "sys.tables" (representada por el alias "a") con la vista "sys.columns"
(representada por el alias "b") utilizando una condición de igualdad en el campo
"object_id". Esto significa que para cada tabla en la base de datos (representada por
"a"), se unen todas las columnas correspondientes (representadas por "b") que
tienen el mismo "object_id". Esto vincula cada tabla a sus columnas respectivas.
En "INNER JOIN sys.systypes c ON b.system_type_id = c.xtype", "INNER JOIN"
relaciona la vista "sys.columns" (representada por el alias "b") con la vista
"sys.systypes" (representada por el alias "c") mediante una condición de igualdad en
el campo "system_type_id" de "b" y el campo "xtype" de "c". Esto permite obtener
información detallada sobre los tipos de datos de las columnas, ya que "c" contiene
detalles sobre los tipos de datos en la base de datos.
"system_type_id" almacena un identificador numérico que representa el tipo de dato
subyacente de una columna, mientras que "c.xtype" contiene una cadena de caracteres
que representa el nombre del tipo de dato.
En "INNER JOIN sys.objects d ON a.object_id = d.object_id", "INNER JOIN" relaciona
nuevamente la tabla "sys.tables" (representada por el alias "a") con la vista
"sys.objects" (representada por el alias "d") utilizando el campo "object_id". Esto
proporciona información adicional sobre los objetos relacionados con las tablas,
como su fecha de creación y otros detalles. En esencia, vincula cada tabla a la
información relacionada con sus objetos en la base de datos.
En un "LEFT JOIN", todas las filas de la tabla de la izquierda ("d" y "b" en este caso)
se incluyen en los resultados, incluso si no tienen coincidencias en la tabla de la
derecha ("ep"). Esto asegura que todas las tablas y columnas se muestren en los
resultados, La vista "sys.extended_properties" almacena información adicional o
propiedades extendidas relacionadas con objetos en la base de datos, le asignamos
el alias "ep".
En "ON d.object_id = ep.major_id AND b.column_Id = ep.minor_id", se establece las
condiciones de unión entre las tablas "d" y "b" con las propiedades extendidas en
"ep". Las condiciones de unión indican cómo relacionar las filas de las tablas "d" y
"b" con las filas correspondientes en "ep".
En "d.object_id = ep.major_id" se establece una relación entre los objetos principales
(generalmente tablas) representados por "d" y las propiedades extendidas
almacenadas en "ep". El "object_id" de "d" se compara con el "major_id" de "ep" para
vincular las propiedades extendidas con las tablas correctas en la base de datos.
En "b.column_Id = ep.minor_id" se vincula columnas específicas representadas por b
con las propiedades extendidas correspondientes en "ep". El "column_Id" de "b" se
compara con el "minor_id" de "ep" para garantizar que las propiedades extendidas se
relacionen con las columnas específicas de manera precisa.
`LEFT JOIN (...) f`: Utilizamos un "LEFT JOIN" para combinar la tabla principal con
una subconsulta (identificada como "f") que recuperará detalles sobre las claves
foráneas y sus relaciones con tablas en la base de datos.
`SELECT f.name AS ForeignKey, ...`: En la subconsulta, seleccionamos ciertos datos
relacionados con las claves foráneas. Esto incluye el nombre de la clave foránea
("ForeignKey"), el nombre de la tabla principal ("TableName"), el nombre de la
columna que actúa como clave foránea ("ColumnName"), el nombre de la tabla de
referencia ("ReferenceTableName") y el nombre de la columna en la tabla de
referencia que está relacionada con la clave foránea ("ReferenceColumnName").
OBJECT_NAME(f.parent_object_id) AS TableName: Esta expresión obtiene el
nombre de la tabla principal (donde se encuentra la clave foránea) usando el
"parent_object_id" de la clave foránea. Luego, asigna este nombre a un alias llamado
"TableName". Esto nos permite conocer la tabla principal involucrada en la relación
de clave foránea.
COL_NAME(fc.parent_object_id, fc.parent_column_id) AS ColumnName: Aquí, se
obtiene el nombre de la columna específica en la tabla principal que actúa como
clave foránea. Se hace usando el "parent_object_id" y "parent_column_id" de la clave
foránea y luego asignando ese nombre a un alias llamado "ColumnName". Esto
identifica la columna que establece la relación de clave foránea.
OBJECT_NAME(f.referenced_object_id) AS ReferenceTableName: Esta parte extrae
el nombre de la tabla de referencia (la tabla relacionada) utilizando el
"referenced_object_id" de la clave foránea. El resultado se guarda en un alias
llamado "ReferenceTableName". Esto nos informa sobre la tabla a la que se hace
referencia en la relación de clave foránea.
COL_NAME(fc.referenced_object_id, fc.referenced_column_id) AS
ReferenceColumnName: Similar al punto anterior, esta expresión obtiene el nombre
de la columna en la tabla de referencia que se relaciona con la clave foránea. Se
hace utilizando el "referenced_object_id" y "referenced_column_id" de la clave
foránea y se asigna a un alias llamado "ReferenceColumnName". Esto identifica la
columna en la tabla de referencia que está conectada a través de la clave foránea.
En conjunto, estas partes de la subconsulta proporcionan detalles esenciales sobre
las relaciones de clave foránea, incluyendo los nombres de las tablas principales y
de referencia, así como las columnas involucradas en la base de datos.
`FROM sys.foreign_keys AS f INNER JOIN sys.foreign_key_columns AS fc ON
f.OBJECT_ID = fc.constraint_object_id`: En esta parte, especificamos de dónde
provienen los datos de la subconsulta. La subconsulta utiliza las vistas
"sys.foreign_keys" (alias "f") y "sys.foreign_key_columns" (alias "fc") para obtener
información sobre las claves foráneas y las columnas que están relacionadas con
ellas. La unión entre estas dos vistas se realiza mediante el campo "OBJECT_ID" de
"f" y el campo "constraint_object_id" de "fc", lo que establece la relación entre las
claves foráneas y las columnas involucradas.
`f ON f.TableName = a.name AND f.ColumnName = b.name`: Finalmente, utilizamos
esta parte para unir la subconsulta "f" con las tablas principales en la consulta
principal. Aquí es donde se establecen las conexiones entre las claves foráneas
recuperadas y las tablas y columnas en la base de datos principal. Se relacionan a
través de los nombres de tabla ("TableName") y nombres de columna
("ColumnName"), lo que nos permite obtener una visión completa de las relaciones
de clave foránea en la base de datos principal.
WHERE a.name <> 'sysdiagrams'
ORDER BY a.name,b.column_Id
WHERE a.name <> 'sysdiagrams': En esta parte filtra las filas donde el nombre de la
tabla en la base de datos principal (a.name) no sea igual a 'sysdiagrams'. En otras
palabras, excluye las tablas con el nombre 'sysdiagrams' de los resultados.
ORDER BY a.name, b.column_Id: Ordena los resultados primero por el nombre de la
tabla (a.name) en orden ascendente y, luego, por el identificador de columna
(b.column_Id) en orden ascendente. Esto organiza la salida de la consulta en función
de estos dos criterios.

Guía diccionario de datos - Gestión de Base de Datos.pdf

  • 1.
    UNIVERSIDAD NACIONAL TECNOLÓGICADE LIMA SUR FACULTAD DE INGENIERÍA Y GESTIÓN ESCUELA PROFESIONAL DE INGENIERÍA DE SISTEMAS TAREA - ANÁLISIS “DICCIONARIO DE DATOS” CURSO: GESTIÓN DE BASE DE DATOS DOCENTE: Blas Rebaza, Maruja Emelita ALUMNO: Tafur Meneses Andy, CÓDIGO 2113110182 Villa El Salvador 2023
  • 2.
    El código aanalizar es el siguiente: USE Matricula; SELECT d.object_id, a.name [table], -- Identificará la Tabla b.name [column], -- Identificará la columna c.name [type], -- Identificará el Tipo CASE -- Recibe el tipo de columna -- Cuando c es 'numeric', 'decimal', o 'float', entonces se precisa el número WHEN c.name = 'numeric' OR c.name = 'decimal' OR c.name = 'float' THEN b.precision ELSE NULL END [Precision], -- Recibe el tamaño máximo de b b.max_length, CASE -- Recibe si la columna acepta nulos WHEN b.is_nullable = 0 THEN 'NO'
  • 3.
    ELSE 'SI' END [PermiteNulos], CASE -- Recibe si la columna es identity (autoincrementable) WHEN b.is_identity = 0 THEN 'NO' ELSE 'SI' END [Es Autonumérico], ep.value [Descripción], -- Recibe la descripción de la columna (si la hay) f.ForeignKey, -- Recibe si es llave foránea f.ReferenceTableName, -- Recibe la referencia de la tabla f.ReferenceColumnName -- Recibe la referencia de la columna FROM sys.tables a -- // Selecciona y muestra toda la información INNER JOIN sys.columns b ON a.object_id = b.object_id INNER JOIN sys.systypes c ON b.system_type_id = c.xtype INNER JOIN sys.objects d ON a.object_id = d.object_id LEFT JOIN sys.extended_properties ep ON d.object_id = ep.major_id AND b.column_Id = ep.minor_id LEFT JOIN (
  • 4.
    SELECT f.name AS ForeignKey, OBJECT_NAME(f.parent_object_id)AS TableName, COL_NAME(fc.parent_object_id, fc.parent_column_id) AS ColumnName, OBJECT_NAME(f.referenced_object_id) AS ReferenceTableName, COL_NAME(fc.referenced_object_id, fc.referenced_column_id) AS ReferenceColumnName FROM sys.foreign_keys AS f INNER JOIN sys.foreign_key_columns AS fc ON f.OBJECT_ID = fc.constraint_object_id ) f ON f.TableName = a.name AND f.ColumnName = b.name WHERE a.name <> 'sysdiagrams' ORDER BY a.name, b.column_Id;
  • 5.
    Al correr elcódigo tenemos: El código que mostré se utiliza para extraer información sobre las estructuras de las tablas y columnas dentro de la base de datos "Matricula" en un servidor SQL Server. Puede ser utilizado para obtener detalles como nombres de tablas, nombres de columnas, tipos de datos, restricciones, propiedades de las columnas, entre otros aspectos relacionados con la base de datos. Explicación: use Matricula
  • 6.
    La instrucción "use…" es una declaración SQL que se utiliza para seleccionar una base de datos específica; esto es útil cuando trabajas con múltiples bases de datos en un servidor de SQL Server y necesitas indicar en cuál de ellas deseas ejecutar tus consultas y comandos. En este caso, "Matricula" es el nombre de la base de datos que se desea utilizar. select d.object_id, a.name [table], b.name [column], c.name [type], La sentencia "select" trabaja con varias tablas y vistas del sistema para recuperar información específica sobre las tablas y columnas en la base de datos "Matricula"; trabaja en conjunto con "FROM sys.tables a", esto lo veremos más adelante. La tabla 'a' hace referencia a la vista del sistema 'sys.tables', la cual almacena información acerca de todas las tablas en la base de datos. 'a.name' se refiere a la columna 'name' de la vista 'a', que contiene los nombres de todas las tablas. El alias '[table]' se utiliza para renombrar la columna 'name'. La tabla 'b' hace referencia a la vista del sistema 'sys.columns', que contiene información sobre las columnas de todas las tablas en la base de datos. 'b.name' se
  • 7.
    refiere a lacolumna 'name' de la vista 'b', que almacena los nombres de las columnas. El alias '[column]' se utiliza para renombrar la columna 'name'. La tabla 'c' se refiere a la vista del sistema 'sys.systypes', que contiene información sobre los tipos de datos utilizados en las columnas de las tablas de la base de datos. 'c.name' se refiere a la columna 'name' de la vista 'c', que almacena los nombres de los tipos de datos. El alias '[type]' se renombrar la columna 'name'. La tabla 'd' hace referencia a la vista del sistema 'sys.objects', que contiene información sobre diversos objetos en la base de datos. 'object_id' es un identificador único que se asocia a cada objeto en la base de datos. No se utiliza necesariamente para identificar objetos específicos en la consulta, sino que se incluye en los resultados de la consulta como parte de la información relacionada con las tablas y columnas. CASE WHEN c.name = 'numeric' OR c.name = 'decimal' OR c.name = 'float' THEN b.precision ELSE null END [Precision], Se coloca "CASE" al iniciar evaluaciones condicionales en SQL.
  • 8.
    Con "WHEN c.name= 'numeric' OR c.name = 'decimal' OR c.name = 'float'" se establece una condición. Si el valor de "c.name" es igual a "numeric," o igual a "decimal," o igual a "float," entonces la condición se cumple. Esto significa que estamos buscando columnas que tengan tipos de dato numéricos o de punto flotante. Con "THEN b.precision", si la condición es verdadera se tomará la acción especificada después de "THEN". En este caso, la acción es devolver el valor de b.precision, que es la precisión de la columna. La precisión generalmente se refiere a la cantidad de dígitos que pueden almacenarse en la columna para los tipos de datos numéricos y de punto flotante. Con "ELSE null", si la condición no se cumple entonces se utiliza NULL, que es un valor especial en SQL que indica la ausencia de un valor concreto. Se coloca "END" para finalizar la expresión "CASE" y, en este caso, se le asigna un alias "[Precision]" al resultado. b.max_length, Como ya sabemos, la tabla 'b' hace referencia a la vista del sistema 'sys.columns', que contiene información sobre las columnas de todas las tablas en la base de datos. 'b.max_length' se refiere a la columna 'max_length' de la vista 'b'; este campo almacena información sobre la longitud máxima permitida para las columnas de tipos de datos de caracteres, como char o varchar.
  • 9.
    CASE WHEN b.is_nullable =0 THEN 'NO' ELSE 'SI' END [Permite Nulls], Como sabemos, se coloca "CASE" al iniciar evaluaciones condicionales en SQL. En "WHEN b.is_nullable = 0 THEN 'NO'", "WHEN" se encarga de establecer la condición como tal; en "b.is_nullable = 0" notamos que el campo "is_nullable" es un campo de "b", o sea de la vista "sys.columns", y se utiliza para indicar si una columna permite valores nulos. Si "is_nullable" es igual a 0, significa que la columna no permite valores nulos. "THEN" se ejecuta si la condición "WHEN" es verdadera, y se devuelve la cadena de texto 'NO'. Esto indica que no se permiten valores nulos en la columna. "ELSE" se ejecuta si la condición "WHEN" no se cumple, y se devuelve la cadena de texto 'SI'. Esto indica que se permiten valores nulos en la columna. Como sabemos, se coloca "END" para finalizar la expresión "CASE" y, en este caso, se le asigna un alias "[Permite Nulls]" al resultado. CASE
  • 10.
    WHEN b.is_identity =0 THEN 'NO' ELSE 'SI' END [Es Autonumerico], Como sabemos, se coloca "CASE" al iniciar evaluaciones condicionales en SQL. En "WHEN b.is_identity = 0 THEN 'NO'", "WHEN" se encarga de establecer la condición como tal; en "b.is_identity" notamos que el campo "is_identity" es un campo de "b", es decir, de la vista "sys.columns", y se utiliza para indicar si la columna es una columna de identidad (también conocida como columna autoincrementable). Si "is_identity" es igual a 0, significa que la columna no es una columna de identidad. "THEN" se ejecuta si la condición "WHEN" es verdadera, y se devuelve la cadena de texto 'NO'. Esto indica que la columna no es una columna de identidad (no es autoincrementable). "ELSE" se ejecuta si la condición "WHEN" no se cumple, y se devuelve la cadena de texto 'SI'. Esto indica que la columna es una columna de identidad (es autoincrementable). Como sabemos, se coloca "END" para finalizar la expresión "CASE" y, en este caso, se le asigna un alias "[Es Autonumerico]" al resultado. ep.value [Descripcion],
  • 11.
    En esta partede la consulta, "ep.value" se utiliza para obtener el valor asociado con una propiedad extendida (extended property) de una columna. Esta propiedad extendida generalmente se utiliza para almacenar una descripción o comentario adicional relacionado con la columna. Una "descripción" se refiere a una explicación o comentario adicional que se adjunta a la columna para proporcionar información adicional sobre su propósito o contenido. Esta descripción no afecta directamente a los datos almacenados en la columna, pero puede ser útil para los usuarios y los desarrolladores que trabajan con la base de datos para comprender mejor la estructura y el significado de la columna. Finalmente, el alias [Descripcion] se asigna a este valor recuperado en los resultados de la consulta. f.ForeignKey, f.ReferenceTableName, f.ReferenceColumnName "f.ForeignKey": Indica si la columna es una clave foránea (foreign key). "f.ReferenceTableName": Muestra el nombre de la tabla a la que la columna hace referencia en caso de ser clave foránea. "f.ReferenceColumnName": Muestra el nombre de la columna de la tabla de referencia a la que la columna actual se relaciona si es clave foránea.
  • 12.
    Pequeña ilustración dela diferencia entre llave primaria (primary key) y llave foránea (foreign key): FROM sys.tables a La cláusula "FROM" se utiliza para especificar la(s) tabla(s) de las cuales deseas recuperar datos. Es decir, defines las fuentes de datos que se utilizarán en la consulta. Como sabemos, "sys.tables" es una tabla del sistema en SQL Server que almacena información sobre todas las tablas de la base de datos actual, como sus nombres, identificadores únicos de objetos (object_id), esquemas, fechas de creación y otras propiedades.
  • 13.
    "a" es unalias que se utiliza para hacer referencia a la tabla "sys.tables" dentro de la consulta. inner join sys.columns b on a.object_id= b.object_id inner join sys.systypes c on b.system_type_id= c.xtype inner join sys.objects d on a.object_id= d.object_id LEFT JOIN sys.extended_properties ep ON d.object_id = ep.major_id AND b.column_Id = ep.minor_id LEFT JOIN ( SELECT f.name AS ForeignKey, OBJECT_NAME (f.parent_object_id) AS TableName, COL_NAME (fc.parent_object_id,fc.parent_column_id) AS ColumnName, OBJECT_NAME (f.referenced_object_id) AS ReferenceTableName, COL_NAME (fc.referenced_object_id,fc.referenced_column_id) AS ReferenceColumnName FROM sys.foreign_keys AS f
  • 14.
    INNER JOIN sys.foreign_key_columnsAS fc ON f.OBJECT_ID = fc.constraint_object_id) f ON f.TableName =a.name AND f.ColumnName =b.name Las operaciones "INNER JOIN" se utilizan para combinar datos de varias vistas del sistema. En "INNER JOIN sys.columns b ON a.object_id = b.object_id", "INNER JOIN" relaciona la tabla "sys.tables" (representada por el alias "a") con la vista "sys.columns" (representada por el alias "b") utilizando una condición de igualdad en el campo "object_id". Esto significa que para cada tabla en la base de datos (representada por "a"), se unen todas las columnas correspondientes (representadas por "b") que tienen el mismo "object_id". Esto vincula cada tabla a sus columnas respectivas. En "INNER JOIN sys.systypes c ON b.system_type_id = c.xtype", "INNER JOIN" relaciona la vista "sys.columns" (representada por el alias "b") con la vista "sys.systypes" (representada por el alias "c") mediante una condición de igualdad en el campo "system_type_id" de "b" y el campo "xtype" de "c". Esto permite obtener información detallada sobre los tipos de datos de las columnas, ya que "c" contiene detalles sobre los tipos de datos en la base de datos. "system_type_id" almacena un identificador numérico que representa el tipo de dato subyacente de una columna, mientras que "c.xtype" contiene una cadena de caracteres que representa el nombre del tipo de dato. En "INNER JOIN sys.objects d ON a.object_id = d.object_id", "INNER JOIN" relaciona nuevamente la tabla "sys.tables" (representada por el alias "a") con la vista
  • 15.
    "sys.objects" (representada porel alias "d") utilizando el campo "object_id". Esto proporciona información adicional sobre los objetos relacionados con las tablas, como su fecha de creación y otros detalles. En esencia, vincula cada tabla a la información relacionada con sus objetos en la base de datos. En un "LEFT JOIN", todas las filas de la tabla de la izquierda ("d" y "b" en este caso) se incluyen en los resultados, incluso si no tienen coincidencias en la tabla de la derecha ("ep"). Esto asegura que todas las tablas y columnas se muestren en los resultados, La vista "sys.extended_properties" almacena información adicional o propiedades extendidas relacionadas con objetos en la base de datos, le asignamos el alias "ep". En "ON d.object_id = ep.major_id AND b.column_Id = ep.minor_id", se establece las condiciones de unión entre las tablas "d" y "b" con las propiedades extendidas en "ep". Las condiciones de unión indican cómo relacionar las filas de las tablas "d" y "b" con las filas correspondientes en "ep". En "d.object_id = ep.major_id" se establece una relación entre los objetos principales (generalmente tablas) representados por "d" y las propiedades extendidas almacenadas en "ep". El "object_id" de "d" se compara con el "major_id" de "ep" para vincular las propiedades extendidas con las tablas correctas en la base de datos. En "b.column_Id = ep.minor_id" se vincula columnas específicas representadas por b con las propiedades extendidas correspondientes en "ep". El "column_Id" de "b" se compara con el "minor_id" de "ep" para garantizar que las propiedades extendidas se relacionen con las columnas específicas de manera precisa.
  • 16.
    `LEFT JOIN (...)f`: Utilizamos un "LEFT JOIN" para combinar la tabla principal con una subconsulta (identificada como "f") que recuperará detalles sobre las claves foráneas y sus relaciones con tablas en la base de datos. `SELECT f.name AS ForeignKey, ...`: En la subconsulta, seleccionamos ciertos datos relacionados con las claves foráneas. Esto incluye el nombre de la clave foránea ("ForeignKey"), el nombre de la tabla principal ("TableName"), el nombre de la columna que actúa como clave foránea ("ColumnName"), el nombre de la tabla de referencia ("ReferenceTableName") y el nombre de la columna en la tabla de referencia que está relacionada con la clave foránea ("ReferenceColumnName"). OBJECT_NAME(f.parent_object_id) AS TableName: Esta expresión obtiene el nombre de la tabla principal (donde se encuentra la clave foránea) usando el "parent_object_id" de la clave foránea. Luego, asigna este nombre a un alias llamado "TableName". Esto nos permite conocer la tabla principal involucrada en la relación de clave foránea. COL_NAME(fc.parent_object_id, fc.parent_column_id) AS ColumnName: Aquí, se obtiene el nombre de la columna específica en la tabla principal que actúa como clave foránea. Se hace usando el "parent_object_id" y "parent_column_id" de la clave foránea y luego asignando ese nombre a un alias llamado "ColumnName". Esto identifica la columna que establece la relación de clave foránea. OBJECT_NAME(f.referenced_object_id) AS ReferenceTableName: Esta parte extrae el nombre de la tabla de referencia (la tabla relacionada) utilizando el "referenced_object_id" de la clave foránea. El resultado se guarda en un alias llamado "ReferenceTableName". Esto nos informa sobre la tabla a la que se hace
  • 17.
    referencia en larelación de clave foránea. COL_NAME(fc.referenced_object_id, fc.referenced_column_id) AS ReferenceColumnName: Similar al punto anterior, esta expresión obtiene el nombre de la columna en la tabla de referencia que se relaciona con la clave foránea. Se hace utilizando el "referenced_object_id" y "referenced_column_id" de la clave foránea y se asigna a un alias llamado "ReferenceColumnName". Esto identifica la columna en la tabla de referencia que está conectada a través de la clave foránea. En conjunto, estas partes de la subconsulta proporcionan detalles esenciales sobre las relaciones de clave foránea, incluyendo los nombres de las tablas principales y de referencia, así como las columnas involucradas en la base de datos. `FROM sys.foreign_keys AS f INNER JOIN sys.foreign_key_columns AS fc ON f.OBJECT_ID = fc.constraint_object_id`: En esta parte, especificamos de dónde provienen los datos de la subconsulta. La subconsulta utiliza las vistas "sys.foreign_keys" (alias "f") y "sys.foreign_key_columns" (alias "fc") para obtener información sobre las claves foráneas y las columnas que están relacionadas con ellas. La unión entre estas dos vistas se realiza mediante el campo "OBJECT_ID" de "f" y el campo "constraint_object_id" de "fc", lo que establece la relación entre las claves foráneas y las columnas involucradas. `f ON f.TableName = a.name AND f.ColumnName = b.name`: Finalmente, utilizamos esta parte para unir la subconsulta "f" con las tablas principales en la consulta principal. Aquí es donde se establecen las conexiones entre las claves foráneas recuperadas y las tablas y columnas en la base de datos principal. Se relacionan a través de los nombres de tabla ("TableName") y nombres de columna
  • 18.
    ("ColumnName"), lo quenos permite obtener una visión completa de las relaciones de clave foránea en la base de datos principal. WHERE a.name <> 'sysdiagrams' ORDER BY a.name,b.column_Id WHERE a.name <> 'sysdiagrams': En esta parte filtra las filas donde el nombre de la tabla en la base de datos principal (a.name) no sea igual a 'sysdiagrams'. En otras palabras, excluye las tablas con el nombre 'sysdiagrams' de los resultados. ORDER BY a.name, b.column_Id: Ordena los resultados primero por el nombre de la tabla (a.name) en orden ascendente y, luego, por el identificador de columna (b.column_Id) en orden ascendente. Esto organiza la salida de la consulta en función de estos dos criterios.