首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从DB中选择DB,其中DB来自表

如何从DB中选择DB,其中DB来自表
EN

Stack Overflow用户
提问于 2014-11-14 08:30:55
回答 3查看 236关注 0票数 1

我有一个.NET项目,有3个数据库(CommonAkten_DEAkten_IT)。所有3个数据库都位于同一个Server上。在数据库Akten_DEAkten_IT中,我有一个表Akt,其中存储来自DE或IT的操作。但是在数据库Common中,我有一个表AktComm,其中存储来自两个数据库的所有操作。在表AktComm中的Common中,我还有一个列DB,其中存储acts数据库名。

AktAkten_DE中的应用

代码语言:javascript
复制
|ID        | ...
|AKT140122 | ... 
|AKT140131 | ...

AktAkten_IT中的应用

代码语言:javascript
复制
|ID        | ...
|AKT140127 | ... 
|AKT140162 | ...

AktCommCommon中的应用

代码语言:javascript
复制
|ID        |DB       |
----------------------
|AKT140122 |Akten_DE |
|AKT140127 |Akten_IT |
|AKT140131 |Akten_DE |
|AKT140162 |Akten_IT |
----------------------

问题是我如何在Common数据库中编写一个select,但根据Common.dbo.AktComm.DB的值从Akten_ITAkten_DE获取数据。

就像这样:

代码语言:javascript
复制
SELECT akt.* 
FROM AktComm comAkt 
INNER JOIN "comAkt.DB".dbo.Akt akt ON comAkt.ID = akt.ID

有人能帮我吗?

谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-11-14 09:56:56

我假设表Akt在每个数据库中都有相同的模式。

这样做的基本查询是一个简单的跨数据库连接,并将结果结合在一起:

代码语言:javascript
复制
SELECT co.ID, de.*
FROM AktComm co
JOIN AKTEN_DE.dbo.Akt de   
  ON co.ID = de.ID collate database_default
 AND co.DB = 'Akten_DE'
UNION ALL
SELECT co.ID, it.*
FROM AktComm co
JOIN AKTEN_DE.dbo.Akt it
  ON co.ID = it.ID collate database_default
 AND co.DB = 'Akten_IT'

当然,这并不是很灵活,因为当您添加新的数据库时,您需要重构查询。如果添加了新的数据库,下面的动态sql将查询数据库。请注意,我没有在DB上进行筛选,因为这将引入一个SQL注入泄漏,而且在总体方案中,如果AktComm表没有在DB字段上进行分区,那么性能差异将是很小的。

代码语言:javascript
复制
declare @sql nvarchar(max)

;WITH dbs as (select distinct DB from AktComm where db_id(DB) is not null)
select @sql = isnull(@sql + N' UNION ALL', N'') + N'
  SELECT co.ID, ' + QUOTENAME(DB) + N'.*
    FROM AktComm co
    JOIN ' + QUOTENAME(DB) + N'.dbo.Akt de   
      ON co.ID = de.ID collate database_default'
  from dbs
 print (@sql)
 exec (@sql)
票数 2
EN

Stack Overflow用户

发布于 2014-11-14 08:44:43

您不可能做到这一点--您必须对Common.AktComm.DB列进行比较,然后执行on或其他SELECT语句:

代码语言:javascript
复制
DECLARE @DB VARCHAR(20)

SELECT @DB = AktComm.DB 
FROM Common
WHERE ID = akt.ID

IF (@DB = 'Akten_DE') THEN
   SELECT akt.* 
   FROM AktComm comAkt 
   INNER JOIN Akten_DE akt ON comAkt.ID = akt.ID
END

IF (@DB = 'Akten_IT') THEN
   SELECT akt.* 
   FROM AktComm comAkt 
   INNER JOIN Akten_IT akt ON comAkt.ID = akt.ID
END

不能使用数据库列的参数值或值“参数化”数据库、表或列名。

票数 1
EN

Stack Overflow用户

发布于 2014-11-14 09:26:26

这将起作用(尽管它可能对您的需要太慢,取决于数据量等)。就你的例子来说,如果你的真实世界的问题有两个或三个以上的数据库,它可能是站不住脚的。

代码语言:javascript
复制
SELECT 
    COALESCE(AKTde.ID, aktIT.ID) AS ID
FROM 
    AktComm comAkt 
    LEFT JOIN AKTEN_DE.dbo.Akt aktDE 
        ON comAkt.ID = aktDE.ID
        AND comAkt.DB = 'Akten_DE'
    LEFT JOIN AKTEN_IT.dbo.Akt aktIT 
        ON comAkt.ID = aktIT.ID
        AND comAkt.DB = 'Akten_IT'
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26925827

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档