2014-11-14 4 views
1

데이터베이스가 3 개인 .NET 프로젝트 (Common, Akten_DE, Akten_IT)가 있습니다. 3 개의 데이터베이스가 모두 동일한 SQL Server에 있습니다. 데이터베이스 Akten_DEAkten_IT에는 테이블 Akt이 있으며 여기에는 DE 또는 IT의 행위가 저장됩니다. 그러나 데이터베이스 Common에 나는 테이블 AktComm을 가지고 있는데, 두 데이터베이스의 모든 행위를 저장합니다. 테이블 AktCommCommon에서 나는 또한 열을 DB 내가 어디에 데이터베이스 데이터베이스 이름을 저장하고있다. Akten_DE에서DB를 테이블에서 선택하는 방법 데이터베이스를 선택하는 방법

Akt :

|ID  | ... 
|AKT140122 | ... 
|AKT140131 | ... 

AktAkten_IT에서 :

|ID  | ... 
|AKT140127 | ... 
|AKT140162 | ... 

AktCommCommon에서는 :

|ID  |DB  | 
---------------------- 
|AKT140122 |Akten_DE | 
|AKT140127 |Akten_IT | 
|AKT140131 |Akten_DE | 
|AKT140162 |Akten_IT | 
---------------------- 

는 질문은 할 수있는 방법입니다 Common 데이터베이스에 선택을 쓰지 만 Common.dbo.AktComm.DB 값에 따라 Akten_IT 또는 Akten_DE에서 데이터를 가져옵니다. 이 같은

뭔가 :

SELECT akt.* 
FROM AktComm comAkt 
INNER JOIN "comAkt.DB".dbo.Akt akt ON comAkt.ID = akt.ID 

아무도 나를 도와 드릴까요?

감사합니다.

답변

2

각 데이터베이스에서 테이블 Akt의 스키마가 같다고 가정합니다.

기본 쿼리

간단한 함께 데이터베이스와 조합을 통해 결과에 가입되어이 작업을 수행합니다 :

물론
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 필드에서 분할되지 않은 경우 성능 차이는 미미할 것입니다.

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) 
+0

이 답변의 두 번째 부분은 앞으로 나에게 더 많은 데이터베이스가 있기 때문에 최선입니다. 고마워요! – wertyk

1

쉽게 할 수 없어 - 당신은에 실행하거나 다른 SELECT 문 다음 Common.AktComm.DB 컬럼에 대한 비교를해야하고 것 :

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

현실 세계 문제에 2-3 개 이상의 데이터베이스가있는 경우이 방법을 사용할 수 있지만 (예 : 너무 느려 데이터 양 등에 따라 느려질 수 있습니다.) 예를 들어 설명해보십시오.

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' 
관련 문제