Dado un SourceTable y un TargetTable, me gustaría crear mediante programación una cadena con todas las uniones requeridas.
En resumen, estoy tratando de encontrar una manera de crear una cadena como esta:
FROM SourceTable t
JOIN IntermediateTable t1 on t1.keycolumn = t.keycolumn
JOIN TargetTable t2 on t2.keycolumn = t1.keycolumn
Tengo una consulta que devuelve todas las claves foráneas para una tabla determinada, pero me encuentro con limitaciones al intentar ejecutar todo esto de forma recursiva para encontrar la ruta de unión óptima y crear la cadena.
SELECT
p.name AS ParentTable
,pc.name AS ParentColumn
,r.name AS ChildTable
,rc.name AS ChildColumn
FROM sys.foreign_key_columns fk
JOIN sys.columns pc ON pc.object_id = fk.parent_object_id AND pc.column_id = fk.parent_column_id
JOIN sys.columns rc ON rc.object_id = fk.referenced_object_id AND rc.column_id = fk.referenced_column_id
JOIN sys.tables p ON p.object_id = fk.parent_object_id
JOIN sys.tables r ON r.object_id = fk.referenced_object_id
WHERE fk.parent_object_id = OBJECT_ID('aTable')
ORDER BY ChildTable, fk.referenced_column_id
Estoy seguro de que esto se ha hecho antes, pero parece que no puedo encontrar un ejemplo.
OrderItems
conOrders
y hacia atrás conOrderItems
.Respuestas:
Tenía un guión que hace una versión rudimentaria del recorrido de claves foráneas. Lo adapté rápidamente (ver más abajo), y es posible que pueda usarlo como punto de partida.
Dada una tabla de destino, el script intenta imprimir la cadena de unión para la ruta más corta (o una de ellas en el caso de vínculos) para todas las tablas de origen posibles, de modo que se puedan atravesar claves foráneas de una sola columna para llegar a la tabla de destino. El script parece estar funcionando bien en la base de datos con un par de miles de tablas y muchas conexiones FK en las que lo probé.
Como otros mencionan en los comentarios, necesitaría hacer esto más complejo si necesita manejar claves externas de múltiples columnas. Además, tenga en cuenta que este no es un código totalmente probado y listo para producción. ¡Espero que sea un punto de partida útil si decides desarrollar esta funcionalidad!
fuente
Puede poner la lista de claves de una tabla con dos campos TAB_NAME, KEY_NAME para todas las tablas que desea conectar.
Ejemplo, para mesa
City
igualmente
Province
yCountry
.Recopile los datos para las tablas y póngalos en una sola tabla (por ejemplo, tabla de metadatos)
Ahora redacte la consulta como a continuación
Esto le mostrará cómo puede vincular las tablas en función de las claves coincidentes (los mismos nombres de clave)
Si cree que el nombre de las claves puede no coincidir, puede incluir un campo de clave alternativo e intentar usarlo en la condición where.
fuente
sys
tablas existentes en SQL Server que describen las columnas de una tabla, cómo se vinculan las tablas, etc. Todo lo que ya existe. Construir sus propias tablas que definan la estructura de su tabla para satisfacer una necesidad específica podría ser una posición alternativa, pero la respuesta preferida usaría lo que ya existe, como lo hace la respuesta aceptada .