SQL Server 연결된 서버 예제 쿼리
Management Studio에 있는 동안 연결된 두 서버 간에 쿼리를 실행하거나 조인을 수행하려고 합니다.연결된 DB 서버를 사용하는 구문이 정확합니까?
select foo.id
from databaseserver1.db1.table1 foo,
databaseserver2.db1.table1 bar
where foo.name=bar.name
기본적으로 db 서버 이름 앞에 db.table을 붙이면 됩니까?
형식은 다음과 같습니다.
<server>.<database>.<schema>.<table>
예: DatabaseServer1.db1.dbo.table1
업데이트: 저는 이것이 오래된 질문이라는 것을 알고 있고 제가 가지고 있는 대답이 옳다는 것을 알고 있습니다. 하지만 저는 이것에 걸려 넘어지는 다른 사람이 몇 가지를 알아야 한다고 생각합니다.
즉, 조인 상황에서 링크된 서버에 대해 쿼리를 실행할 때 링크된 서버의 전체 테이블이 조인 작업을 수행하기 위해 쿼리가 실행 중인 서버로 다운로드될 수 있습니다.작전 담당자의 경우 둘 다table1
DB1
그리고.table1
DB2
은 "" " " " " 입니다. 이름이 지정된 것으로 추정됩니다.DB3
.
테이블이 크면 작업을 실행하는 데 시간이 오래 걸릴 수 있습니다.결국 메모리 또는 디스크 전송 속도보다 훨씬 느린 네트워크 트래픽 속도에 의해 제한됩니다.
가능한 경우 로컬 테이블에 가입하지 않고 원격 서버에 대해 단일 쿼리를 수행하여 필요한 데이터를 임시 테이블로 가져옵니다.그럼 질문을 해보세요.
이 작업이 불가능한 경우 SQL 서버가 전체 테이블을 로컬로 로드해야 하는 다양한 작업을 검토해야 합니다.를 들어 예들어사용을 사용합니다.GETDATE()
특정 조인도 가능합니다.다른 공연 킬러들은 적절한 권리를 주지 않는 것을 포함합니다.
자세한 내용은 http://thomaslarock.com/2013/05/top-3-performance-killers-for-linked-server-queries/ 을 참조하십시오.
SELECT * FROM OPENQUERY([SERVER_NAME], 'SELECT * FROM DATABASE_NAME..TABLENAME')
도움이 될 수도 있습니다.
이러한 다른 답에 문제가 있는 사람들을 위해, 시도해 보세요.
예:
SELECT * FROM OPENQUERY([LinkedServer], 'select * from [DBName].[schema].[tablename]')
그래도 문제가 있는 경우<server>.<database>.<schema>.<table>
을 버서이다포함으로 묶습니다.[]
참조의 일부로 스키마/소유자(기본적으로 dbo)를 지정해야 합니다.또한 최신(ANSI-92) 조인 스타일을 사용하는 것이 좋습니다.
select foo.id
from databaseserver1.db1.dbo.table1 foo
inner join databaseserver2.db1.dbo.table1 bar
on foo.name = bar.name
select * from [Server].[database].[schema].[tablename]
이것이 올바른 전화 방법입니다.쿼리를 실행하기 전에 서버가 연결되어 있는지 확인하십시오!
연결된 서버 호출 확인하기
EXEC sys.sp_linkedservers
테이블을 마우스 오른쪽 버튼으로 클릭하고 스크립트 테이블을 선택하여 클릭합니다.
select name from drsql01.test.dbo.employee
- drslq01은 servermae --linked server입니다.
- 테스트는 데이터베이스 이름입니다.
- dbo는 스키마 - 기본 스키마입니다.
- 직원은 테이블 이름입니다.
링크된 서버에 대한 쿼리 실행 방법을 이해하는 데 도움이 되었으면 합니다.
일반적으로 SQL 서버의 임시 데이터베이스를 많이 사용하기 때문에 연결된 서버의 경우 직접 쿼리를 사용하면 안 됩니다.첫 번째 단계에서 데이터가 임시 DB로 검색된 다음 필터링이 수행됩니다.이것에 대한 실마리가 많이 있습니다.OPENQUERY는 SQL을 원본 연결 서버로 전달한 다음 필터링된 결과를 반환하므로 OPENQUERY를 사용하는 것이 좋습니다.
SELECT *
FROM OPENQUERY(Linked_Server_Name , 'select * from TableName where ID = 500')
저는 다음 구문이 가장 잘 작동한다는 것을 발견했습니다.
[LINKED_SERVER]에서 * 선택...[표]
데이터베이스 이름을 사용하여 다른 사용자의 작업 추천을 받을 수 없습니다.또한 이 데이터 원본에는 스키마가 없습니다.
sql-server(로컬)에서는 연결된 서버(원격)에서 데이터를 쿼리하는 두 가지 방법이 있습니다.
분산 쿼리(4부 표기법):
- 일부 원격 서버에서는 작동하지 않을 수 있습니다.원격 서버가 MySQL이면 분산 쿼리가 작동하지 않습니다.
- 필터 및 조인이 효율적으로 작동하지 않을 수 있습니다.WHERE 절이 있는 단순 쿼리가 있는 경우 sql-server(local)가 먼저 원격 서버에서 전체 테이블을 가져온 다음 WHERE 절을 로컬로 적용할 수 있습니다.큰 테이블의 경우 많은 데이터가 원격에서 로컬로 이동되기 때문에 매우 비효율적입니다.그러나 항상 그렇지는 않습니다.로컬 서버가 원격 서버의 테이블 통계에 액세스할 수 있는 경우 오픈 쿼리를 사용하는 것만큼 효율적일 수 있습니다. 자세한 내용
- T-SQL 구문은 긍정적인 측면에서 작동합니다.
SELECT * FROM [SERVER_NAME].[DATABASE_NAME].[SCHEMA_NAME].[TABLE_NAME]
오픈쿼리
- 이것은 기본적으로 통과입니다.쿼리는 원격 서버에서 완전히 처리되므로 인덱스 또는 원격 서버의 최적화를 사용합니다.원격에서 로컬 sql-server로 전송되는 데이터 양을 효과적으로 줄입니다.
- 이 접근 방식의 작은 단점은 원격 서버가 sql-server가 아닌 경우 T-SQL 구문이 작동하지 않는다는 것입니다.
SELECT * FROM OPENQUERY([SERVER_NAME], 'SELECT * FROM DATABASE_NAME.SCHEMA_NAME.TABLENAME')
전반적인 OPENQUERY는 대부분의 경우에 사용하기에 훨씬 더 좋은 옵션인 것 같습니다.
openquery를 사용하여 link_server 테이블의 데이터 유형을 확인했고 결과는 성공적이었습니다.
SELECT * FROM OPENQUERY (LINKSERVERNAME, '
SELECT DATA_TYPE, COLUMN_NAME
FROM [DATABASENAME].INFORMATION_SCHEMA.COLUMNS
WHERE
TABLE_NAME =''TABLENAME''
')
그것은 나를 위한 일입니다.
쿼리를 따르는 것이 가장 좋습니다.
이 쿼리 사용:
SELECT * FROM OPENQUERY([LINKED_SERVER_NAME], 'SELECT * FROM [DATABASE_NAME].[SCHEMA].[TABLE_NAME]')
MySQL을 MS SQL에 연결하는 데 매우 도움이 됩니다.
PostgreSQL:
- 데이터 소스 DSN에서 데이터베이스 이름을 제공해야 합니다.
- 관리자로 Management Studio 실행
쿼리에서 DBName을 생략해야 합니다.
SELECT * FROM OPENQUERY([LinkedServer], 'select * from schema."tablename"')
MariaDB(그리고 아마도 MySQL)의 경우 3-dot 구문을 사용하여 스키마를 지정하려고 시도했지만 작동하지 않아 "스키마 또는 카탈로그의 잘못된 사용" 오류가 발생했습니다.다음 솔루션이 작동했습니다.
- SSMS에서 Server Objects > Linked Servers > Provider > MSDASQL로 이동합니다.
- "Dynamic parameter", "Level 0 only" 및 "Allow in process"가 모두 선택되어 있는지 확인합니다.
그런 다음 다음 구문을 사용하여 스키마 및 테이블을 쿼리할 수 있습니다.
SELECT TOP 10 *
FROM LinkedServerName...[SchemaName.TableName]
출처: SELECT * OpenQuery 없이 SQL Server를 사용하는 MySQL Linked Server에서
이름 뒤에 "를 추가해 보셨습니까?
예:
select foo.id
from "databaseserver1".db1.table1 foo,
"databaseserver2".db1.table1 bar
where foo.name=bar.name
언급URL : https://stackoverflow.com/questions/4091960/sql-server-linked-server-example-query
'programing' 카테고리의 다른 글
Swift 2: 통화를 던질 수 있지만 '시도'로 표시되지 않고 오류가 처리되지 않습니다. (0) | 2023.05.11 |
---|---|
Java용 Eclipse IDE - 완전 다크 테마 (0) | 2023.05.11 |
Swift에 액세스 수식어가 있습니까? (0) | 2023.05.11 |
AKS(Azure Managed Kubernetes)에서 모든 컴퓨팅을 중지 (0) | 2023.05.11 |
Postgre에 행이 있는지 가장 빠르게 확인SQL (0) | 2023.05.11 |