서로 다른 서버에있는 두 개의 서로 다른 데이터베이스에 두 개의 테이블이 있습니다. 몇 가지 쿼리를 만들기 위해 조인해야합니다. 어떤 옵션이 있습니까? 어떻게해야합니까?
답변
sp_addlinkedserver
서버 링크를 생성 하려면을 사용해야 합니다. 사용법 은 참조 문서 를 참조 하십시오 . 서버 링크가 설정되면 데이터베이스 이름에 다른 서버를 접두사로 붙이고 쿼리를 정상적으로 구성합니다. IE :
-- FROM DB1
SELECT *
FROM [MyDatabaseOnDB1].[dbo].[MyTable] tab1
INNER JOIN [DB2].[MyDatabaseOnDB2].[dbo].[MyOtherTable] tab2
ON tab1.ID = tab2.ID
링크가 설정 OPENQUERY
되면를 사용 하여 원격 서버에서 SQL 문을 실행하고 데이터 만 다시 전송할 수 있습니다. 이것은 조금 더 빠를 수 있으며 원격 서버가 쿼리를 최적화 할 수 있도록합니다. DB1
위의 예 에서 임시 (또는 메모리 내) 테이블에 데이터를 캐시하면 표준 테이블을 조인하는 것처럼 쿼리 할 수 있습니다. 예를 들면 :
-- Fetch data from the other database server
SELECT *
INTO #myTempTable
FROM OPENQUERY([DB2], 'SELECT * FROM [MyDatabaseOnDB2].[dbo].[MyOtherTable]')
-- Now I can join my temp table to see the data
SELECT * FROM [MyDatabaseOnDB1].[dbo].[MyTable] tab1
INNER JOIN #myTempTable tab2 ON tab1.ID = tab2.ID
더 많은 예제를 보려면 OPENQUERY 에 대한 문서를 확인하십시오 . 위의 예는 꽤 고안된 것입니다. 이 특정 예에서는 첫 번째 방법을 확실히 사용하지만 두 번째 옵션 OPENQUERY
을 사용하면 쿼리를 사용하여 일부 데이터를 필터링 할 경우 시간과 성능을 절약 할 수 있습니다.
답변
이 시도:
SELECT tab2.column_name
FROM [DB1.mdf].[dbo].[table_name_1] tab1 INNER JOIN [DB2.mdf].[dbo].[table_name_2] tab2
ON tab1.col_name = tab2.col_name
답변
연결된 서버가 dba에서 허용되지 않는 경우 OPENROWSET을 사용할 수 있습니다. 온라인 설명서에서 필요한 구문을 제공합니다.
답변
실용적인 엔터프라이즈 관점에서 가장 좋은 방법은 데이터베이스에 데이터베이스 테이블의 미러링 된 복사본을 만든 다음 작업 / 프로 시저가 매시간 델타로 업데이트하도록하는 것입니다.
답변
두 테이블의 조인은 DBMS에서 가장 잘 수행되므로 그렇게해야합니다. 데이터베이스 중 하나에서 더 작은 테이블 또는 그 하위 집합을 미러링 한 다음 조인 할 수 있습니다. informatica와 같은 ETL 서버에서이 작업을 수행하려는 유혹을받을 수 있지만 테이블이 거대하면 권장하지 않습니다.
답변
데이터베이스 연결 옵션을 사용할 수없는 경우 취할 수있는 또 다른 방법은 ODBC를 통해 테이블을 MS Access 또는 Crystal 보고서와 같은 항목에 연결하고 거기에서 조인하는 것입니다.
답변
하드 코딩 된 데이터베이스 이름은 SQL 쿼리 내에서 항상 최선의 접근 방식이 아닐 수 있습니다. 따라서 동의어를 추가하는 것이 더 나은 방법입니다. 여러 스테이징 환경에서 데이터베이스가 항상 동일한 이름을 갖는 것은 아닙니다. PROD, UAT, SIT, QA 등과 같은 접미사로 구성 될 수 있습니다. 따라서 하드 코딩 된 쿼리를 인식하고보다 동적으로 만드십시오.
접근법 # 1 : 동의어를 사용하여 동일한 서버의 데이터베이스간에 테이블을 연결합니다.
접근 방식 # 2 : 각 데이터베이스에서 별도로 데이터를 수집하고 코드에 결합합니다. 데이터베이스 연결 문자열은 데이터베이스 또는 구성 파일을 통해 앱 서버 구성의 일부가 될 수 있습니다.