sql - 每列连接数据库,其中数据位于不同的数据库中
问题描述
我正在尝试从位于不同数据库中但具有相同架构的表中获取数据。
IE 数据库名称类似于:DB1、DB2、DB3。
它们都包含表'MyTable'并且有一个外键匹配数据库中的'MainTable'主键,我们将称之为MainDB,我只是做一个联合并担心稍后的性能,但问题是,在这种特殊情况下,有时 DB3(或其中任何一个)不存在,这会导致我的查询失败并且需要每天进行编辑。
MainTable 的列在组合时构成了我需要在每列上加入的数据库的名称,为简单起见,我将其称为名为 ForeignDBName 的列。我想要类似的东西
SELECT
MainPK
, FName
, LName
, BirthDate
, ForeignDBName
FROM
MainDB.dbo.MainTable
LEFT JOIN
(
SELECT
BirthDate
,MainTableFK
FROM
DB1.dbo.MyTable
UNION ALL
SELECT
BirthDate
,MainTableFK
FROM
DB2.dbo.MyTable
UNION ALL
SELECT
BirthDate
,MainTableFK
FROM
DB3.dbo.MyTable
) B ON B.MainTableFK = MainPK
解决方案
因为您不知道实际需要多少个数据库,所以您需要运行一些动态 SQL:
DECLARE @statement nvarchar(2048);
DECLARE @db_name varchar(128);
SET @statement='SELECT
MainPK
, FName
, LName
, BirthDate
, ForeignDBName
FROM
MainDB.dbo.MainTable LEFT JOIN ('
DECLARE db_cursor CURSOR FOR
--adjust database names here
select [name] from sys.databases where [name] in ('DB1','DB2','DB3','DB4','DB5')
ORDER BY name
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @db_name
WHILE @@FETCH_STATUS = 0
BEGIN
SET @statement=@statement+CHAR(10)+'SELECT BirthDate,MainTableFK FROM '+@db_name+'.dbo.MyTable UNION ALL ';
FETCH NEXT FROM db_cursor INTO @db_name
END
CLOSE db_cursor;
DEALLOCATE db_cursor;
-- we remove the last UNION ALL from the statement
SET @statement=LEFT(@statement,LEN(@statement) - 10)
SET @statement=@statement+') B ON B.MainTableFK = MainPK'
-- comment this to hide the statement that will be executed
print @statement;
--uncomment this if you want to actually execute the statement
--exec sp_executesql @statement
推荐阅读
- ruby-on-rails - 如何在启用 SSL 的 Rails 应用程序中的单个 Rack::Proxy 请求中禁用 SSL?
- gstreamer - 如何等待 x264enc 在流结束时对缓冲帧进行编码
- php - 无法修改 MySQL 8 文档存储中的行:集合到数组
- php - 将 jwt 从 5.4 迁移到 1.0.x 后,Laravel 不对用户进行身份验证
- git-branch - 使用“下一个”分支发布我的下一个版本,现在我如何将它与语义发布合并到 master
- javascript - 为什么 Sonarqube 告诉我 await 在异步函数中是多余的
- mocking - 在 IntelliJ 中使用 mock 执行 karateDSL 场景
- instagram - 如何从我的 3rd 方应用发布到 Instagram?
- javascript - mwc.js 和 mwc.esm.js 有什么区别?
- android - 在 Flutter 应用程序的源代码管理中隐藏 Google Maps API 密钥