Unir una tabla con otra tabla en una base de datos diferente por cadena de nombre [duplicado]

Resuelto UncaughtExceptionConnoisseur asked hace 9 meses • 0 respuestas

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')

Aceptado

Puede utilizar una UNION ALLconsulta 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.

Charlieface avatar Feb 16 '2024 11:02 Charlieface