답변:
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
하드 코딩 된 데이터베이스 이름은 SQL 쿼리 내에서 항상 최선의 접근 방식이 아닐 수 있습니다. 따라서 동의어를 추가하는 것이 더 나은 방법입니다. 여러 스테이징 환경에서 데이터베이스가 항상 동일한 이름을 갖는 것은 아닙니다. PROD, UAT, SIT, QA 등과 같은 접미사로 구성 될 수 있습니다. 따라서 하드 코딩 된 쿼리를 인식하고보다 동적으로 만드십시오.
접근법 # 1 : 동의어를 사용하여 동일한 서버의 데이터베이스간에 테이블을 연결합니다.
접근 방식 # 2 : 각 데이터베이스에서 별도로 데이터를 수집하고 코드에 결합합니다. 데이터베이스 연결 문자열은 데이터베이스 또는 구성 파일을 통해 앱 서버 구성의 일부가 될 수 있습니다.
이 코드를 아래에서 시도했는데 잘 작동합니다.
SELECT TimeTrackEmployee.StaffID
FROM dbo.tblGBSTimeCard AS GBSTimeCard INNER JOIN
TimeTrak.dbo.tblEmployee AS TimeTrackEmployee ON GBSTimeCard.[Employee Number] = TimeTrackEmployee.GBSStaffID
이를 위해 간단히 아래 쿼리를 따르십시오.
select a.Id,a.type,b.Name,b.City from DatabaseName.dbo.TableName a left join DatabaseName.dbo.TableName b on a.Id=b.Id
내가 databasename을 작성한 곳에 데이터베이스의 이름을 정의해야합니다. 동일한 데이터베이스에 있으므로 데이터베이스 이름을 정의 할 필요가 없지만 다른 데이터베이스에있는 경우 경로로 데이터베이스 이름을 언급해야합니다. 그렇지 않으면 오류가 표시됩니다. 내가 당신의 일을 쉽게 만들었기를 바랍니다.
두 테이블을 조인하는 데 문제가있는 동안 두 원격 데이터베이스를 동시에 열어서 원하는 작업을 정확히 수행하지 못했습니다. MySQL 5.6 (php 7.1) 및 기타 MySQL 5.1 (php 5.6)
//Open a new connection to the MySQL server
$mysqli1 = new mysqli('server1','user1','password1','database1');
$mysqli2 = new mysqli('server2','user2','password2','database2');
//Output any connection error
if ($mysqli1->connect_error) {
die('Error : ('. $mysqli1->connect_errno .') '. $mysqli1->connect_error);
} else {
echo "DB1 open OK<br>";
}
if ($mysqli2->connect_error) {
die('Error : ('. $mysqli2->connect_errno .') '. $mysqli2->connect_error);
} else {
echo "DB2 open OK<br><br>";
}
화면에 두 개의 OK가 표시되면 두 데이터베이스가 모두 열려 있고 준비된 것입니다. 그런 다음 쿼리를 진행할 수 있습니다.
$results = $mysqli1->query("SELECT * FROM video where video_id_old is NULL");
while($row = $results->fetch_array()) {
$theID = $row[0];
echo "Original ID : ".$theID." <br>";
$doInsert = $mysqli2->query("INSERT INTO video (...) VALUES (...)");
$doGetVideoID = $mysqli2->query("SELECT video_id, time_stamp from video where user_id = '".$row[13]."' and time_stamp = ".$row[28]." ");
while($row = $doGetVideoID->fetch_assoc()) {
echo "New video_id : ".$row["video_id"]." user_id : ".$row["user_id"]." time_stamp : ".$row["time_stamp"]."<br>";
$sql = "UPDATE video SET video_id_old = video_id, video_id = ".$row["video_id"]." where user_id = '".$row["user_id"]."' and video_id = ".$theID.";";
$sql .= "UPDATE video_audio SET video_id = ".$row["video_id"]." where video_id = ".$theID.";";
// Execute multi query if you want
if (mysqli_multi_query($mysqli1, $sql)) {
// Query successful do whatever...
}
}
}
// close connection
$mysqli1->close();
$mysqli2->close();
나는 약간 조인을하려고했지만, 난 그 두 DB를 열고 가지고 있기 때문에, 나는 다시 갈 수 갔다 단지 연결을 변경하여 querys을하고 $mysqli1
또는$mysqli2
그것은 나를 위해 일했습니다. 도움이되기를 바랍니다. 건배