我面前有一个数据库服务器,它由多个数据库组成。为了简单起见,我们假设有一个主数据库,其中有一个 Main 表,如下所示。
Main.dbo.MainTable
| ID | Value | DBName |
| -- | ----- | ------ |
| 1 | 12912 | DBA |
| 2 | 10113 | DBA |
| 3 | 00197 | DBB |
| 4 | 63512 | DBC |
| 5 | 12312 | DBB |
在 DBName 列中,定义了包含有关条目的更多信息的数据库的名称。 DBA、DBB、DBC 和 DBD 都使用相同的模式。 我现在需要将主表与其他数据库中找到的表连接起来。确切地说,我需要定义的 DBName 中的表并将其连接到 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 |
我尝试使用变量和 exec 语句从数据库名称字符串中获取表,但这不起作用。
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')
您可以使用一个大的
UNION ALL
查询,并为每个子表添加一个固定列,以便您可以加入它。
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;
理想情况下将该派生表放入视图中以将逻辑保留在一个位置。