Unir una tabla con otra tabla en una base de datos diferente por cadena de nombre [duplicado]
Tengo un servidor de base de datos frente a mí, que consta de varias bases de datos. Para simplificar, digamos que hay una base de datos principal con una tabla Main que se parece a la siguiente.
Main.dbo.MainTable
| ID | Value | DBName |
| -- | ----- | ------ |
| 1 | 12912 | DBA |
| 2 | 10113 | DBA |
| 3 | 00197 | DBB |
| 4 | 63512 | DBC |
| 5 | 12312 | DBB |
En la columna DBName se define el nombre de una base de datos con más información sobre la entrada. DBA, DBB, DBC y DBD utilizan el mismo esquema. Ahora necesito unir la tabla principal con una tabla que se encuentra en las otras bases de datos. Para ser exactos, necesito la tabla del DBName definido y unirla a la tabla principal en id = id.
DBA.dbo.SomeTable
| ID | Info 1| Info 2|
| -- | ----- | ----- |
| 1 | 82732 | 28192 |
| 2 | 23772 | 71277 |
| 3 | 13913 | 82831 |
| 4 | 02283 | 91028 |
| 5 | 92322 | 81297 |
Intenté usar variables y declaraciones ejecutivas para obtener la tabla de la cadena del nombre de la base de datos, pero no funcionó.
declare @dbname nvarchar(100); exec('select @dbname = main.DBName from Main.dbo.MainTable main left join '+ @dbname +'.dbo.SomeTable other on main.ID = other.ID')
Puede utilizar una UNION ALL
consulta grande y agregar una columna fija para cada subtabla para poder unirse a ella.
select
dbname = main.DBName
from Main.dbo.MainTable main
left join (
SELECT *, 'DBA' AS DBName
FROM DBA.dbo.SomeTable
UNION ALL
SELECT *, 'DBB'
FROM DBB.dbo.SomeTable
UNION ALL
SELECT *, 'DBC'
FROM DBC.dbo.SomeTable
UNION ALL
SELECT *, 'DBD'
FROM DBD.dbo.SomeTable
) other ON main.DBName = other.DBName AND main.ID = other.ID;
Lo ideal sería poner esa tabla derivada en una vista para mantener la lógica en un solo lugar.