SQL Server 연결된 서버 예제 쿼리


94

Management Studio에있는 동안 두 개의 연결된 서버간에 쿼리를 실행 / 조인하려고합니다. 연결된 db 서버를 사용하는 올바른 구문입니까?

select foo.id 
from databaseserver1.db1.table1 foo, 
     databaseserver2.db1.table1 bar 
where foo.name=bar.name

기본적으로 db.table 앞에 db 서버 이름을 입력합니까?

답변:


188

형식은 다음과 같아야합니다.

<server>.<database>.<schema>.<table>

예 : DatabaseServer1.db1.dbo.table1


업데이트 : 나는 이것이 오래된 질문이고 내가 가진 대답이 정확하다는 것을 알고 있습니다. 그러나 나는 이것에 걸려 넘어지는 다른 사람은 몇 가지를 알아야한다고 생각합니다.

즉, 조인 상황에서 연결된 서버에 대해 쿼리 할 때 연결된 서버의 ENTIRE 테이블 이 조인 작업을 수행하기 위해 쿼리가 실행되는 서버로 다운로드 될 가능성높습니다 . OP의 경우, table1from DB1table1from DB2은 모두 쿼리를 실행하는 서버 (아마도 DB3.

당신이 큰 테이블이있는 경우,이 있습니다 실행하는 데 시간이 오래 걸리는 작업이 발생할. 결국 그것은 이제 메모리 또는 심지어 디스크 전송 속도보다 훨씬 느린 네트워크 트래픽 속도에 의해 제한됩니다.

가능하면 로컬 테이블에 조인하지 않고 원격 서버에 대해 단일 쿼리를 수행하여 필요한 데이터를 임시 테이블로 가져옵니다. 그런 다음 그것을 쿼리하십시오.

이것이 가능하지 않다면 SQL 서버가 전체 테이블을 로컬로로드해야하는 다양한 사항을 살펴 봐야합니다. 예를 들어 GETDATE()또는 특정 조인을 사용 합니다. 다른 성능 킬러에는 적절한 권리를 제공하지 않는 것이 포함됩니다.

자세한 내용은 http://thomaslarock.com/2013/05/top-3-performance-killers-for-linked-server-queries/ 를 참조하십시오 .


11
데이터베이스 서버 이름에 하이픈이있는 경우 대괄호로 묶어야합니다
bmw0128

4
@ bmw0128 : 더 나은 방법은 큰 따옴표를 사용하는 것입니다. Microsoft의 대괄호와 달리 거의 모든 플랫폼에서 지원됩니다.

2
또한 데이터베이스 서버 이름에 마침표가있는 경우 대괄호 또는 큰 따옴표를 사용해야합니다.
David Brunow

4
한정자에 대해 잘 모르는 경우 SSMS 개체 탐색기에서 연결된 서버의 테이블로 드릴 다운하고 마우스 오른쪽 단추를 클릭 한 다음 테이블 스크립트, 선택 대상 및 새 쿼리 편집기 창을 클릭합니다. 결과 SELECT 문에는 테이블에 대한 올바른 정규화 된 경로가 포함됩니다. Sybase와 함께 작업 할 때 미스터리 데이터베이스 한정자가 있었는데 올바른 이름이 주어졌습니다.
John Mo

테이블 전체가 옮겨진다는 말이 틀렸다고 생각합니다. 그 정보를 어디서 얻었는지에 대한 참고 자료를 제공 할 수 있습니까? 방금 연결된 서버에서 2 억 4 천만 행 (16GB 데이터, 6.6GB 인덱스)이있는 테이블에 대해 조인을 시도했는데 데이터가 캐시 된 것으로 추정되므로 5 개의 행에 연결하는 데 47ms, 두 번째 쿼리에 7ms가 걸렸습니다. 조인에 연결된 테이블에 대한 테이블 스캔이 필요한 경우 모두 전송해야할까요?
Jason Goemaat 2015 년

32
SELECT * FROM OPENQUERY([SERVER_NAME], 'SELECT * FROM DATABASE_NAME..TABLENAME')

이것은 당신을 도울 수 있습니다.


찬성. 이것은 MySQL을 MS SQL에 연결할 때 작동합니다.
Baz Guvenkaya

3
즉, 통과 쿼리를 만드는 것입니다. 쿼리 문은 서버의 기본 SQL로 작성되어야합니다. 오라클 구문 등 SQL Server가 아닌 테라 데이타 다른 다른 것
AxGryndr

11

여전히 문제가있는 경우 <server>.<database>.<schema>.<table>

서버 이름을 []


주의 : 나는이 선택] [이용하여, 대신 연결된 서버에 생성되는 테이블이 같은 이름으로 로컬로 생성에서 테이블을 만들고 실행dbo.databaseserver1.db1.dbo.table1
biscuit314

9

이러한 다른 답변에 문제가있는 사람들을 위해 , 시도OPENQUERY

예:

 SELECT * FROM OPENQUERY([LinkedServer], 'select * from [DBName].[schema].[tablename]') 

SQL Server에서 작동
Tom Stickel 2017

8

참조의 일부로 스키마 / 소유자 (기본적으로 dbo)를 지정해야합니다. 또한 최신 (ANSI-92) 조인 스타일을 사용하는 것이 좋습니다.

select foo.id 
    from databaseserver1.db1.dbo.table1 foo
        inner join databaseserver2.db1.dbo.table1 bar 
            on foo.name = bar.name

내부 조인 구문이 암시 적 조인보다 선호됩니까?
bmw0128 2010

2
@ bmw0128 : 예, 여러 가지 이유가 있습니다. IMHO, 가장 중요한 것은 테이블과 조인이 두 개의 다른 위치에있을 때 실수로 교차 곱 조인을 작성하는 것이 너무 쉽다는 것입니다.

4 개의 점으로 된 부분은 일부 비 SQL Server 연결 서버에서 작동하지 않습니다. 다음과 같은 오류가 발생할 수 있습니다. 연결된 서버 "MyLinkedServer"의 공급자 "MSDASQL"에 대해 잘못된 스키마 또는 카탈로그가 지정되었습니다.
brewmanz

6
select * from [Server].[database].[schema].[tablename] 

이것이 올바른 전화 방법입니다. 쿼리를 실행하기 전에 서버가 연결되어 있는지 확인하십시오!

연결된 서버 호출을 확인하려면 :

EXEC sys.sp_linkedservers 

일부 비 SQL Server 연결 서버에서는 작동하지 않습니다. 다음과 같은 오류가 발생합니다. 연결된 서버 "MyLinkedServer"의 공급자 "MSDASQL"에 대해 잘못된 스키마 또는 카탈로그가 지정되었습니다.
brewmanz

4
select name from drsql01.test.dbo.employee
  • drslq01은 servernmae --linked serer입니다.
  • 테스트는 데이터베이스 이름입니다.
  • dbo는 스키마-기본 스키마입니다.
  • 직원은 테이블 이름입니다.

연결된 서버에 대한 쿼리 실행 방법을 이해하는 데 도움이 되었기를 바랍니다.


2

연결된 서버의 경우 SQL 서버의 임시 데이터베이스를 많이 사용하므로 일반적으로 직접 쿼리를 사용하지 마십시오. 첫 번째 단계에서 데이터는 임시 DB로 검색되고 필터링이 발생합니다. 이것에 대한 많은 스레드가 있습니다. SQL을 소스 연결된 서버로 전달한 다음 필터링 된 결과를 반환하므로 open OPENQUERY를 사용하는 것이 좋습니다.

SELECT *
FROM OPENQUERY(Linked_Server_Name , 'select * from TableName where ID = 500')

이 답변에는 데이터베이스 이름이 포함되어 있지 않습니다
Chris Nevill

2
연결된 서버를 만드는 동안 데이터베이스 정보를 제공했습니다. 자세한 내용은 아래 MSDN 링크를 참조하십시오 : msdn.microsoft.com/en-us/library/ff772782(v=sql.110).aspx
Muhammad Yaseen

연결된 서버에 인증이 필요하고 PDO를 사용하여 PHP 응용 프로그램에서 쿼리를 시도하는 경우 어떻게해야합니까?
nekiala

이 접근 방식을 사용하여 데이터베이스 1에서 연결된 서버의 데이터베이스로 조인을 수행하는 방법은 무엇입니까?
eaglei22

2

그만한 가치는 다음 구문이 가장 잘 작동한다는 것을 알았습니다.

[LINKED_SERVER]에서 * 선택 ... [표]

데이터베이스 이름을 사용하여 다른 사람의 작업 권장 사항을 얻을 수 없습니다. 또한이 데이터 소스에는 스키마가 없습니다.


2

테이블을 마우스 오른쪽 버튼으로 클릭하고 스크립트 테이블을 클릭하십시오.

여기에 이미지 설명 입력


즉, 영업 이익은 무엇을 요구하지 않습니다
Fandango68

2
이것은 연결된 테이블에서 선택 쿼리에 대한 올바른 구문을 얻는 방법을 보여줍니다. 결과는 SEANS의 대답처럼
시몬 Doodkin

1
@ShimonDoodkin는의 좋은 예는 나에게 물고기를주는,하지만 어떻게 물고기 가르쳐하지 않습니다
암로

0

다음 쿼리가 가장 잘 작동합니다.

이 쿼리를 시도하십시오.

SELECT * FROM OPENQUERY([LINKED_SERVER_NAME], 'SELECT * FROM [DATABASE_NAME].[SCHEMA].[TABLE_NAME]')

MySQL을 MS SQL에 연결하는 것은 매우 도움이됩니다.


0

PostgreSQL :

  1. 데이터 소스 DSN데이터베이스 이름 을 제공해야합니다 .
  2. 관리자 권한으로 Management Studio 실행
  3. 쿼리에서 DBName을 생략 해야합니다 .

    SELECT * FROM OPENQUERY([LinkedServer], 'select * from schema."tablename"')


0

나는 openquery를 사용하여 link_server의 테이블에서 데이터 유형을 알아 냈고 그 결과는 성공적이었습니다.

SELECT * FROM OPENQUERY (LINKSERVERNAME, '
SELECT DATA_TYPE, COLUMN_NAME
FROM [DATABASENAME].INFORMATION_SCHEMA.COLUMNS
WHERE 
     TABLE_NAME  =''TABLENAME''
')

나를위한 일

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.