SQL Server에서 서로 다른 두 서버에서 데이터 선택
SQL Server의 서로 다른 두 서버에있는 서로 다른 두 데이터베이스에서 동일한 쿼리의 데이터를 어떻게 선택할 수 있습니까?
찾고있는 것은 연결된 서버입니다. 개체 탐색기 트리의 다음 위치에서 SSMS로 가져올 수 있습니다.
Server Objects-->Linked Servers
또는 sp_addlinkedserver 를 사용할 수 있습니다 .
하나만 설정하면됩니다. 그런 다음 다른 서버에서 다음과 같이 테이블을 호출 할 수 있습니다.
select
*
from
LocalTable,
[OtherServerName].[OtherDB].[dbo].[OtherTable]
소유자가 항상 그런 것은 아니므로 dbo사용하는 스키마로 바꾸십시오.
연결된 서버를 사용하여 수행 할 수 있습니다.
일반적으로 연결된 서버는 데이터베이스 엔진이 다른 SQL Server 인스턴스 또는 Oracle과 같은 다른 데이터베이스 제품의 테이블을 포함하는 Transact-SQL 문을 실행할 수 있도록 구성됩니다. Microsoft Access 및 Excel을 포함한 많은 유형의 OLE DB 데이터 소스를 링크 된 서버로 구성 할 수 있습니다.
연결된 서버는 다음과 같은 장점을 제공합니다.
- SQL Server 외부에서 데이터에 액세스하는 기능
- 기업 전체의 이기종 데이터 소스에서 분산 쿼리, 업데이트, 명령 및 트랜잭션을 발행 할 수있는 기능
- 다양한 데이터 소스를 유사하게 처리 할 수있는 기능.
연결된 서버 에 대해 자세히 알아보십시오 .
다음 단계에 따라 연결된 서버를 만드십시오.
서버 객체-> 연결된 서버-> 새로운 연결된 서버
원격 서버 이름을 제공하십시오.
원격 서버 유형 (SQL Server 또는 기타)을 선택하십시오.
보안->이 보안 컨텍스트를 사용하여 작성을 선택하고 원격 서버의 로그인 및 비밀번호를 제공하십시오.
확인을 클릭하면 완료됩니다!
다음 은 연결된 서버를 만드는 간단한 자습서입니다.
또는
쿼리를 사용하여 연결된 서버를 추가 할 수 있습니다.
통사론:
sp_addlinkedserver [ @server= ] 'server' [ , [ @srvproduct= ] 'product_name' ]
[ , [ @provider= ] 'provider_name' ]
[ , [ @datasrc= ] 'data_source' ]
[ , [ @location= ] 'location' ]
[ , [ @provstr= ] 'provider_string' ]
[ , [ @catalog= ] 'catalog' ]
sp_addlinkedserver 에 대해 자세히 알아보십시오 .
연결된 서버 는 한 번만 만들어야합니다 . 연결된 서버를 만든 후 다음과 같이 쿼리 할 수 있습니다.
select * from LinkedServerName.DatabaseName.OwnerName.TableName
SELECT
*
FROM
[SERVER2NAME].[THEDB].[THEOWNER].[THETABLE]
연결된 서버 사용을 볼 수도 있습니다. 링크 된 서버는 DB2 플랫폼과 같은 다른 유형의 데이터 소스 일 수도 있습니다. 이것은 SQL Server TSQL 또는 Sproc 호출에서 DB2에 액세스하는 방법 중 하나입니다 ...
서로 다른 2 개의 데이터베이스에 대한 쿼리는 분산 쿼리입니다. 다음은 몇 가지 기술과 장단점 목록입니다.
- 연결된 서버 : SQL Server 복제가 제공하는 것보다 다양한 데이터 원본에 대한 액세스를 제공합니다
- 연결된 서버 : 복제가 지원하지 않거나 임시 액세스가 필요한 데이터 원본에 연결
- 연결된 서버 : OPENDATASOURCE 또는 OPENROWSET보다 우수한 성능
- OPENDATASOURCE 및 OPENROWSET 기능 : 데이터 소스에서 데이터를 임시로 검색하는 데 편리합니다. OPENROWSET에는 바이올린 기능이있는 형식 파일이 필요하지 않을 수도있는 BULK 기능이 있습니다.
- OPENQUERY : 변수를 지원하지 않습니다
- 모두 T-SQL 솔루션입니다. 비교적 쉽게 구현 및 설정
- 모두 성능과 확장성에 영향을 줄 수있는 소스와 대상 간의 연결에 의존합니다.
이것들은 모두 훌륭한 답변이지만, 이것은 누락되었으며 자체적으로 강력한 용도로 사용됩니다. 아마도 OP가 원하는 것에 맞지 않을 수도 있지만 질문은 모호했으며 다른 사람들이 여기에서 길을 찾을 수 있다고 생각합니다. 기본적으로 1 개의 창을 사용하여 여러 서버에 대해 동시에 쿼리를 실행할 수 있습니다. 방법은 다음과 같습니다.
SSMS에서 등록 된 서버를 열고 로컬 서버 그룹 아래에 새 서버 그룹을 만듭니다 .
이 그룹 아래 에서 조회하려는 각 서버에 대해 새 서버 등록 을 작성하십시오 . DB 이름이 다른 경우 특성에서 각각의 기본값을 설정하십시오.
이제 첫 번째 단계에서 생성 한 그룹으로 돌아가서 마우스 오른쪽 버튼을 클릭하고 새 쿼리를 선택하십시오. 새 쿼리 창이 열리고 실행하는 모든 쿼리가 그룹의 각 서버에서 실행됩니다. 결과는 레코드의 서버를 나타내는 추가 열 이름과 함께 단일 데이터 세트로 표시됩니다. 상태 표시 줄을 사용하면 서버 이름이 여러 개로 바뀝니다 .
이 시도:
SELECT * FROM OPENROWSET('SQLNCLI', 'Server=YOUR SERVER;Trusted_Connection=yes;','SELECT * FROM Table1') AS a
UNION
SELECT * FROM OPENROWSET('SQLNCLI', 'Server=ANOTHER SERVER;Trusted_Connection=yes;','SELECT * FROM Table1') AS a
SQL_server 2008을 원격 서버에서 호스팅되는 SQL_server 2016에 연결하는 것과 동일한 문제가있었습니다. 다른 답변은 저에게 직접 효과가 없었습니다. 다른 사람에게 유용 할 수 있다고 생각하면서 여기에 조정 된 솔루션을 작성합니다.
원격 IP DB 연결에 대한 확장 된 답변 :
1 단계 : 서버 연결
EXEC sp_addlinkedserver @server='SRV_NAME',
@srvproduct=N'',
@provider=N'SQLNCLI',
@datasrc=N'aaa.bbb.ccc.ddd';
EXEC sp_addlinkedsrvlogin 'SRV_NAME', 'false', NULL, 'your_remote_db_login_user', 'your_remote_db_login_password'
... SRV_NAME발명 된 이름은 어디 입니까? 쿼리에서 원격 서버를 참조하는 데 사용합니다. aaa.bbb.ccc.dddSQLserver DB를 호스팅하는 원격 서버의 IP 주소입니다.
2 단계 : 쿼리 실행 예를 들면 다음과 같습니다.
SELECT * FROM [SRV_NAME].your_remote_db_name.dbo.your_table
...그리고 그게 다야!
구문 세부 정보 : sp_addlinkedserver 및 sp_addlinkedsrvlogin
한 서버에서 다른 서버로 연결된 서버 정의를 만든 다음 (이 작업을 수행하려면 SA가 필요함) 4 부분으로 이름을 지정하여 참조하십시오 (BOL 참조).
서버 2008 :
SSMS가 server1.DB1에 연결된 경우 다음을 시도하십시오.
SELECT * FROM
[server2].[DB2].[dbo].[table1]
다른 사람들이 지적했듯이, 작동하지 않으면 서버가 연결되어 있지 않기 때문입니다.
오류가 발생합니다.
sys.servers에서 서버 DB2를 찾을 수 없습니다. 올바른 서버 이름이 지정되었는지 확인하십시오. 필요한 경우 저장 프로 시저 sp_addlinkedserver를 실행하여 sys.servers에 서버를 추가하십시오.
서버를 추가하려면
참조 : sp_addlinkedserver를 사용하여 서버를 추가하려면 링크 : [1] : sp_addlinkedserver를 사용하여 서버를 추가하려면
sys.servers에 무엇이 있는지 보려면 그냥 쿼리하십시오.
SELECT * FROM [sys].[servers]
select *
from [ServerName(IP)].[DatabaseName].[dbo].[TableName]
@ Super9는 데이터 공급자 SQLOLEDB 와 함께 SQL Server 인증을 사용하여 OPENDATASOURCE에 대해 설명했습니다 . 방금 한 테이블의 코드 스 니펫이 코드가 실행중인 현재 서버 데이터베이스에 있고 다른 서버 '192.166.41.123'에 게시됩니다.
SELECT top 2 * from dbo.tblHamdoonSoft tbl1 inner JOIN
OpenDataSource('SQLOLEDB','Data Source=192.166.41.123;User ID=sa;Password=hamdoonsoft')
.[TestDatabase].[dbo].[tblHamdoonSoft1] tbl2 on tbl1.id = tbl2.id
sp_addlinkedserver('servername')
그래서 이것처럼 가야합니다-
select * from table1
unionall
select * from [server1].[database].[dbo].[table1]
나는 이것이 오래된 질문이라는 것을 알고 있지만 동의어를 사용합니다. 쿼리가 데이터베이스 서버 A 내에서 실행되고 서버 A에 존재하지 않는 데이터베이스 서버 B에서 테이블을 찾습니다. 서버 B에서 테이블을 호출하는 A 데이터베이스에서 동의어를 추가하십시오. 스키마 또는 다른 데이터베이스 이름을 포함하려면 평소마다 테이블 이름을 호출하면 작동합니다.
동의어가 일종의 연결이기 때문에 서버를 연결할 필요가 없습니다.
서버 개체 ---> 연결된 서버 ---> 새로운 연결된 서버
연결된 서버에서 다른 서버의 서버 이름 또는 IP 주소를 작성하고 SQL Server를 선택하십시오. 보안 선택 (이 보안 컨텍스트를 사용하여 작성) 다른 서버의 로그인 및 비밀번호 쓰기
이제 연결 후
Select * from [server name or ip addresses ].databasename.dbo.tblname
연결된 서버 추가를위한 단순화 된 솔루션
첫 번째 서버
EXEC sp_addlinkedserver @server='ip,port\instancename'
두 번째 로그인
EXEC sp_addlinkedsrvlogin 'ip,port\instancename', 'false', NULL, 'remote_db_loginname', 'remote_db_pass'
로컬 DB에 연결된 쿼리 실행
INSERT INTO Tbl (Col1, Col2, Col3)
SELECT Col1, Col2, Col3
FROM [ip,port\instancename].[linkedDBName].[linkedTblSchema].[linkedTblName]
참고 URL : https://stackoverflow.com/questions/1144051/selecting-data-from-two-different-servers-in-sql-server
'development' 카테고리의 다른 글
| OnBeforeUnload 대화 상자를 재정의하고 내 대화 상자로 바꾸려면 어떻게해야합니까? (0) | 2020.03.03 |
|---|---|
| NSInteger와 int를 사용하는 경우 (0) | 2020.03.03 |
| 데이터베이스 자동 생성 데이터베이스 MySQL (0) | 2020.03.03 |
| SQL, PL-SQL 및 T-SQL의 차이점은 무엇입니까? (0) | 2020.03.03 |
| 트랜잭션 또는 SaveChanges (false) 및 AcceptAllChanges ()를 사용합니까? (0) | 2020.03.03 |