SQL 서버의 서로 다른 두 서버에서 데이터 선택
SQL Server의 서로 다른 두 서버에 있는 두 개의 다른 데이터베이스에서 동일한 쿼리로 데이터를 선택하려면 어떻게 해야 합니까?
찾고 있는 것은 Linked Servers입니다.SSMS에서는 오브젝트익스플로러의 트리의 다음 위치에서 액세스 할 수 있습니다.
Server Objects-->Linked Servers
또는 sp_addlinkedserver를 사용할 수 있습니다.
하나만 설정하면 됩니다.이것을 취득하면, 다음과 같이 다른 서버의 테이블을 호출할 수 있습니다.
select
*
from
LocalTable,
[OtherServerName].[OtherDB].[dbo].[OtherTable]
이 항상 그렇지는 하십시오.dbo
사용하는 스키마로 치환해 주세요.
Linked Server를 사용하여 수행할 수 있습니다.
일반적으로 링크된 서버는 데이터베이스 엔진이 SQL Server의 다른 인스턴스 또는 Oracle과 같은 다른 데이터베이스 제품의 테이블을 포함하는 Transact-SQL 문을 실행할 수 있도록 구성됩니다.Microsoft Access 및 Excel을 포함하여 많은 유형의 OLE DB 데이터 원본을 연결된 서버로 구성할 수 있습니다.
링크된 서버에는 다음과 같은 이점이 있습니다.
- SQL Server 외부에서 데이터에 액세스하는 기능.
- 기업 전체에서 이종 데이터 소스에 대해 분산 쿼리, 업데이트, 명령 및 트랜잭션을 실행할 수 있습니다.
- 다양한 데이터 소스를 비슷하게 다루는 능력.
Linked Servers에 대한 자세한 내용은 여기를 참조하십시오.
Linked Server를 작성하려면 다음 절차를 수행합니다.
서버 오브젝트 -> 링크된 서버 -> 새로운 링크된 서버
리모트 서버명을 지정합니다.
원격 서버 유형(SQL Server 또는 기타)을 선택합니다.
[보안] -> [이 보안 콘텍스트를 사용하여 작성]를 선택하고 리모트서버의 로그인과 패스워드를 입력합니다.
[확인]을 클릭하면 완료!!
다음은 링크된 서버를 작성하기 위한 간단한 튜토리얼입니다.
또는
쿼리를 사용하여 연결된 서버를 추가할 수 있습니다.
구문:
sp_addlinkedserver [ @server= ] 'server' [ , [ @srvproduct= ] 'product_name' ]
[ , [ @provider= ] 'provider_name' ]
[ , [ @datasrc= ] 'data_source' ]
[ , [ @location= ] 'location' ]
[ , [ @provstr= ] 'provider_string' ]
[ , [ @catalog= ] 'catalog' ]
sp_addlinked 서버에 대한 자세한 내용은 이쪽.
링크된 서버를 한 번만 생성해야 합니다.링크된 서버를 작성한 후 다음과 같이 조회할 수 있습니다.
select * from LinkedServerName.DatabaseName.OwnerName.TableName
SELECT
*
FROM
[SERVER2NAME].[THEDB].[THEOWNER].[THETABLE]
Linked Servers를 사용하는 방법도 확인할 수 있습니다.링크된 서버는 DB2 플랫폼과 같은 다른 유형의 데이터 소스일 수도 있습니다.이것은 SQL Server TSQL 또는 Sproc 호출에서 DB2에 액세스하기 위한 한 가지 방법입니다.
2개의 서로 다른 데이터베이스에 대한 쿼리는 분산 쿼리입니다.다음은 몇 가지 기술과 장단점을 나열한 목록입니다.
- 링크된 서버: SQL Server 레플리케이션보다 다양한 데이터 소스에 대한 접근을 제공합니다.
- 링크된 서버: 레플리케이션이 지원하지 않거나 애드혹 액세스가 필요한 데이터 소스와 연결
- 링크 서버: OPENDATASOURCE 또는 OPENROWSET보다 뛰어난 퍼포먼스
- OPENDATASOURCE 및 OPENROWSET 기능:데이터 소스에서 데이터를 임시로 검색할 때 편리합니다.OPENROWSET에는 BULK 패실리티가 있어 포맷파일이 필요하거나 필요 없는 경우도 있습니다.
- OPENQUERY: 변수를 지원하지 않습니다.
- 모두 T-SQL 솔루션입니다.비교적 구현 및 셋업이 용이함
- 모두 소스와 타깃 간의 접속에 의존하여 퍼포먼스와 scalability에 영향을 줄 수 있습니다.
이것들은 모두 훌륭한 답이지만, 이것은 누락되어 있고, 그것만의 강력한 용도가 있습니다.OP가 원하는 것과 맞지 않을 수도 있지만, 질문이 모호해서 다른 사람들이 여기로 오는 길을 찾을 수 있을 것 같습니다.기본적으로 하나의 창을 사용하여 여러 서버에 대해 쿼리를 동시에 실행할 수 있습니다.다음 방법은 다음과 같습니다.
SSMS에서 Registered Servers를 열고 Local Server Groups 아래에 새 서버 그룹을 만듭니다.
이 그룹 아래에서 쿼리할 각 서버에 대해 새 서버 등록을 작성합니다.DB 이름이 다를 경우 속성에서 각각에 대해 기본값을 설정하십시오.
첫 번째 단계에서 만든 그룹으로 돌아가서 마우스 오른쪽 버튼을 클릭하고 New Query를 선택합니다.새 쿼리 창이 열리고 그룹 내 각 서버에서 실행된 쿼리가 실행됩니다.결과는 레코드가 어떤 서버에서 왔는지 나타내는 추가 열 이름과 함께 단일 데이터 세트에 표시됩니다.상태 표시줄을 사용하면 서버 이름이 여러 개로 바뀝니다.
이것을 시험해 보세요.
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.ddd
는 SQL Server DB를 호스트하는 리모트서버의 IP 주소입니다.
2단계: 쿼리 실행 예:
SELECT * FROM [SRV_NAME].your_remote_db_name.dbo.your_table
...바로 그거야!
구문 상세: sp_addlinkedserver 및 sp_addlinkedsrvlogin
Server 2008:
SSMS에서 server1에 접속되어 있는 경우.DB1 및 시도:
SELECT * FROM
[server2].[DB2].[dbo].[table1]
다른 사용자가 지적한 바와 같이, 작동하지 않는 것은 서버가 연결되어 있지 않으면 서버가 연결되어 있지 않기 때문입니다.
다음과 같은 에러가 표시됩니다.
sys.servers에서 서버 DB2를 찾을 수 없습니다.올바른 서버명이 지정되어 있는 것을 확인합니다.필요에 따라 저장 프로시저 sp_addlinkedserver를 실행하여 서버를 sys.servers에 추가합니다.
서버를 추가하려면:
참조:sp_addlinkedserver Link [1]를 사용하여 서버를 추가하려면 sp_addlinkedserver를 사용합니다.
sys.servers에 무엇이 있는지 확인하려면 다음 절차를 따릅니다.
SELECT * FROM [sys].[servers]
링크된 서버 추가를 위한 간단한 솔루션
첫 번째 서버
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]
하나의 서버에서 다른 서버로 Linked Server 정의를 작성한 후(이를 위해 SA가 필요), 4부분의 이름을 사용하여 참조합니다(BOL 참조).
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
오래된 질문인 건 알지만 동의어를 사용합니다.쿼리는 데이터베이스 서버 A 내에서 실행되며 서버 A에 존재하지 않는 데이터베이스 서버 B 내의 테이블을 찾습니다.그런 다음 서버 B에서 테이블을 호출하는 동의어를 A 데이터베이스에 추가합니다.쿼리는 스키마나 다른 데이터베이스 이름을 포함할 필요가 없습니다.평소대로 테이블 이름을 호출하면 작동합니다.
speak당 동의어는 일종의 링크이므로 서버를 링크할 필요가 없습니다.
sp_addlinkedserver('servername')
그래서 이렇게 될 거예요.
select * from table1
unionall
select * from [server1].[database].[dbo].[table1]
Server Objects ---> 링크된 서버 ---> 새로운 링크된 서버
링크된 서버에서 다른 서버의 서버 이름 또는 IP 주소를 쓰고 [SQL Server In Security](이 보안 컨텍스트를 사용하여 작성)를 선택합니다.다른 서버의 로그인과 패스워드를 기입합니다.
연결 후 사용
Select * from [server name or ip addresses ].databasename.dbo.tblname
위에서 언급한 모든 설명이 OP의 원래 질문에 대한 답을 얻었기를 바랍니다.SQL Server를 링크 서버로 추가하기 위한 코드 스니펫을 추가하고 싶습니다.
"SQL "를 를 링크된 서버로 할 수 .sp_addlinkedserver
는 입니다.@server
말해 네.
-- using IP address
exec sp_addlinkedserver @server='192.168.1.11'
-- PC domain name
exec sp_addlinkedserver @server='DESKTOP-P5V8JTN'
으로 SQL Server를 채웁니다.SRV_PROVIDERNAME
,SRV_PRODUCT
,SRV_DATASOURCE
디폴트값으로 설정합니다.이를 통해 쿼리의 4부분 테이블 주소에 IP 또는 PC 도메인 이름을 기입해야 합니다(아래 예).링크된 서버에 기본 포트 또는 인스턴스가 없을 경우 이 주소는 이와 비슷해 보일 수 있으며 읽기 어려울 수 있습니다.192.168.1.11,1430
★★★★★★★★★★★★★★★★★」192.168.1.11,1430\MSSQLSERVER2019
.
따라서 4개의 부품 주소를 짧고 읽기 쉽게 하기 위해 다음과 같이 다른 파라미터를 지정하여 풀주소가 아닌 서버의 에일리어스 이름을 추가할 수 있습니다.
exec sp_addlinkedserver
@server='ReadSrv1',
@srvproduct='SQL Server',
@provider='SQLNCLI',
@datasrc='192.168.1.11,1430\MSSQLSERVER2019'
이 하면 다음 . - 이 오류가 나다.You cannot specify a provider or any properties for product 'SQL Server'.
의 으로 두면''
또는 다른 값을 지정하면 쿼리가 정상적으로 실행됩니다.
다음 단계에서는 다음 쿼리를 실행하여 리모트 링크 서버에 로그인합니다.
EXEC sp_addlinkedsrvlogin @rmtsrvname = 'ReadSrv1', @useself = 'false', @locallogin = NULL, @rmtuser = 'sa', @rmtpassword = 'LinkedServerPasswordForSA'
파트주소를 은 - 4개의 파트주소입니다.을 사용하다
[ServerName].[DatabaseName].[Schema].[ObjectName]
- - -
SELECT TOP 100 t.* FROM ReadSrv1.AppDB.dbo.ExceptionLog t
- 기존 링크된 서버를 나열하려면 다음 작업을 수행합니다.
exec sp_linkedservers
- 링크된 서버를 삭제하려면 다음 작업을 수행합니다.
exec sp_dropserver @server = 'ReadSrv1', @droplogins='droplogins'
) OR(「」)
exec sp_dropserver @server = 'ReadSrv1', @droplogins='NULL'
(로그인 유지)
언급URL : https://stackoverflow.com/questions/1144051/selecting-data-from-two-different-servers-in-sql-server
'programing' 카테고리의 다른 글
SQL Server 복원 오류 - 액세스가 거부되었습니다. (0) | 2023.04.08 |
---|---|
OPTION(재컴파일)은 항상 고속입니다.그 이유는 무엇입니까? (0) | 2023.04.08 |
문의 "INSERT IN..." 부분을 반복하지 않고 여러 행을 삽입하시겠습니까? (0) | 2023.04.08 |
SQL 기본 제약 조건을 이름을 모르면서 삭제하는 방법 (0) | 2023.04.08 |
SQL Server SELECT IN @variable? (0) | 2023.04.08 |