메뉴 닫기

[MSSQL] OPENQUERY와 OPENROWSET, Linked Server로 외부 데이터 바로 조회하는 방법

[MSSQL] OPENQUERY와 OPENROWSET, Linked Server로 외부 데이터 바로 조회하는 방법

🚀 SQL에서 다른 서버 데이터를 실시간으로 불러오는 OPENQUERY와 OPENROWSET 활용법

데이터 분석이나 시스템 통합 작업을 하다 보면 다른 서버나 외부 데이터베이스의 자료를 실시간으로 확인해야 할 때가 많습니다.
이럴 때 데이터를 옮기거나 복잡한 백업 과정을 거치지 않고, MSSQL에서 바로 조회할 수 있는 기능이 있다면 업무 효율이 크게 높아집니다.
바로 그 역할을 하는 것이 OPENQUERYOPENROWSET입니다.
이 두 함수는 Linked Server를 통해 다른 데이터베이스에 직접 연결하거나, 쿼리를 실행해 필요한 데이터만 빠르게 불러올 수 있도록 도와줍니다.
이를 잘 활용하면 데이터 마이그레이션, 통합 리포트 작성, 분산된 시스템 간 데이터 교환 등 다양한 상황에서 강력한 솔루션이 될 수 있습니다.

이번 글에서는 OPENQUERY와 OPENROWSET의 개념과 차이, Linked Server 설정 방법, 실전 사용 예제까지 차근차근 살펴보겠습니다.
또한 실제 업무 환경에서 자주 마주치는 오류 해결 방법과 성능 최적화 팁도 함께 다룰 예정입니다.
마지막에는 보안 관점에서 주의해야 할 사항까지 정리하니, 끝까지 읽으시면 한 번에 전체 흐름을 파악하실 수 있을 것입니다.



🔍 OPENQUERY와 OPENROWSET 개념 이해하기

MSSQL에서 OPENQUERYOPENROWSET는 외부 데이터베이스에 접근해 데이터를 조회하거나 조작할 수 있는 강력한 함수입니다.
둘 모두 Linked Server 또는 OLE DB 프로바이더를 통해 연결되지만, 사용 방식과 목적에 차이가 있습니다.
업무 환경에 맞춰 적절한 함수를 선택하면 데이터 통합과 분석 속도를 크게 향상시킬 수 있습니다.

📌 OPENQUERY란?

OPENQUERY는 이미 설정된 Linked Server를 통해 원격 서버에서 쿼리를 실행하는 방식입니다.
즉, 쿼리는 원격 서버에서 처리된 후 결과만 로컬 서버로 반환되므로 대량의 데이터를 효율적으로 가져올 수 있습니다.
예를 들어, Oracle, MySQL, 다른 SQL Server 인스턴스 등 다양한 외부 DB에 직접 접속하여 집계, 필터링, JOIN 같은 작업을 수행할 수 있습니다.

CODE BLOCK
SELECT * 
FROM OPENQUERY(LinkedServerName, 'SELECT name, age FROM Users WHERE age > 30');

📌 OPENROWSET이란?

OPENROWSET은 Linked Server를 미리 설정하지 않고도, 쿼리 실행 시 즉석에서 연결 정보를 지정해 외부 데이터를 불러올 수 있습니다.
주로 임시 연결이나 테스트, 파일 기반 데이터 소스(CSV, Excel 등)에서 데이터를 가져올 때 활용됩니다.
단, 보안 정책상 기본적으로 비활성화되어 있는 경우가 많아, 사용 전 SQL Server에서 Ad Hoc Distributed Queries를 활성화해야 합니다.

CODE BLOCK
SELECT * 
FROM OPENROWSET('SQLNCLI', 
                'Server=ServerName;Trusted_Connection=yes;', 
                'SELECT name, age FROM Users WHERE age > 30');

💎 핵심 포인트:
OPENQUERY는 Linked Server 기반의 정기적이고 대량 데이터 처리에, OPENROWSET은 즉석 연결 및 임시 데이터 조회에 강점을 가집니다.

⚙️ Linked Server 설정 및 연결 방법

MSSQL에서 Linked Server는 다른 데이터베이스 서버와의 연결을 미리 구성하여, 매번 접속 정보를 입력하지 않고도 데이터를 조회할 수 있게 해주는 기능입니다.
OPENQUERY와 함께 사용하면 원격 서버에서 데이터를 직접 가져오거나 쿼리를 실행할 수 있습니다.
다양한 DBMS(Oracle, MySQL, PostgreSQL, 다른 SQL Server 인스턴스 등)와도 연결 가능하며, 보안 설정만 올바르게 구성하면 안정적인 데이터 연동이 가능합니다.

📌 SSMS에서 Linked Server 추가하기

  • 🛠️SQL Server Management Studio에서 개체 탐색기 열기
  • 🔌서버 개체 → Linked Servers → 마우스 오른쪽 → 새 연결 선택
  • ⚙️연결할 DBMS의 서버 이름, 프로바이더, 보안 계정 입력

📌 T-SQL로 Linked Server 등록하기

GUI를 사용하지 않고 T-SQL로도 Linked Server를 등록할 수 있습니다.
아래 예시는 다른 SQL Server 인스턴스를 연결하는 방법입니다.

CODE BLOCK
EXEC sp_addlinkedserver 
    @server='LinkedServerName', 
    @srvproduct='', 
    @provider='SQLNCLI', 
    @datasrc='ServerName';

EXEC sp_addlinkedsrvlogin 
    @rmtsrvname='LinkedServerName', 
    @useself='false', 
    @locallogin=NULL, 
    @rmtuser='UserName', 
    @rmtpassword='Password';

⚠️ 주의: 잘못된 보안 설정은 외부에서 DB에 무단 접근할 위험이 있습니다. IP 제한, 방화벽, 최소 권한 계정 설정을 반드시 적용하세요.



💻 OPENQUERY 실전 사용 예제

OPENQUERY를 활용하면 Linked Server에 연결된 원격 데이터베이스에서 직접 쿼리를 실행하고, 그 결과를 로컬 서버에서 바로 활용할 수 있습니다.
이는 대량 데이터 처리나 복잡한 조건 검색에 특히 유리하며, 네트워크 부하를 줄이고 응답 속도를 개선할 수 있습니다.
아래는 업무 환경에서 자주 쓰이는 OPENQUERY의 활용 예시입니다.

📌 기본 SELECT 예제

CODE BLOCK
SELECT * 
FROM OPENQUERY(LinkedServerName, 'SELECT TOP 100 * FROM Sales.Orders');

위 쿼리는 원격 서버의 Sales.Orders 테이블에서 상위 100개의 레코드를 가져옵니다.
이 방식은 전체 데이터를 로컬로 불러와 필터링하는 것이 아니라, 원격 서버에서 먼저 필터링을 수행하므로 불필요한 데이터 전송을 줄일 수 있습니다.

📌 JOIN과 집계 함수 사용

CODE BLOCK
SELECT * 
FROM OPENQUERY(LinkedServerName, 
    'SELECT c.CustomerName, COUNT(o.OrderID) AS OrderCount
     FROM Customers c
     JOIN Orders o ON c.CustomerID = o.CustomerID
     GROUP BY c.CustomerName
     HAVING COUNT(o.OrderID) > 10');

위 예제는 원격 서버에서 고객별 주문 건수를 계산한 뒤, 주문이 10건 이상인 고객만 반환합니다.
이렇게 하면 로컬 서버에서 집계를 수행하는 것보다 훨씬 빠르게 결과를 받을 수 있습니다.

💎 핵심 포인트:
OPENQUERY는 쿼리의 실행 위치가 원격 서버이므로, 네트워크 부하를 최소화하고 성능을 최적화하는 데 유리합니다.

🛠️ OPENROWSET 실전 사용 예제

OPENROWSET은 Linked Server를 설정하지 않고도, 외부 데이터 소스에 직접 연결해 데이터를 조회할 수 있는 강력한 방법입니다.
즉석 연결이 가능하다는 장점 덕분에 테스트나 임시 분석, 파일 기반 데이터 조회에 자주 활용됩니다.
다만 보안 정책에 따라 기본적으로 Ad Hoc Distributed Queries 옵션이 비활성화되어 있으므로, 사용 전 해당 기능을 활성화해야 합니다.

📌 SQL Server 인스턴스 직접 연결

CODE BLOCK
SELECT * 
FROM OPENROWSET('SQLNCLI', 
                'Server=ServerName;Trusted_Connection=yes;', 
                'SELECT TOP 50 * FROM Sales.Customers');

이 예제는 SQL Server 네이티브 클라이언트를 사용해 다른 인스턴스에 직접 접속하고, 고객 데이터 상위 50건을 불러옵니다.
Linked Server 설정 없이도 즉시 실행이 가능하다는 장점이 있습니다.

📌 Excel 파일에서 데이터 읽기

CODE BLOCK
SELECT * 
FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 
                'Excel 12.0;Database=C:\Data\sales.xlsx;HDR=YES', 
                'SELECT * FROM [Sheet1$]');

이 예제는 Excel 파일을 데이터 소스로 지정하여, 첫 번째 시트의 모든 데이터를 읽어옵니다.
파일 기반 데이터를 SQL Server로 통합하거나 분석할 때 매우 유용합니다.

💎 핵심 포인트:
OPENROWSET은 즉석 연결파일 데이터 읽기에 강점이 있으나, 보안과 성능 설정을 반드시 검토해야 합니다.



⚠️ 보안 및 성능 최적화 주의사항

OPENQUERY와 OPENROWSET은 강력한 데이터 접근 기능을 제공하지만, 잘못 사용하면 보안 취약점과 성능 저하를 초래할 수 있습니다.
안전하고 효율적인 운영을 위해 반드시 다음 사항을 확인하세요.

📌 보안 측면에서의 주의사항

  • 🔑외부 접속 계정은 최소 권한 원칙을 적용
  • 🛡️방화벽과 IP 접근 제어로 승인된 서버만 연결 허용
  • 🔍모든 원격 쿼리 실행 이력을 로그 모니터링으로 추적

📌 성능 최적화를 위한 팁

외부 서버와의 연결은 네트워크 대역폭, 원격 서버의 부하 상태, 쿼리 복잡도 등에 따라 속도 차이가 큽니다.
다음과 같은 방법으로 성능을 개선할 수 있습니다.

  • WHERE, GROUP BY 등 필터링 조건은 반드시 원격 쿼리에 포함
  • 📊필요한 컬럼만 선택하여 데이터 전송량 최소화
  • 🗂️반복 사용되는 쿼리는 뷰(View) 또는 저장 프로시저로 생성

⚠️ 주의: OPENROWSET 사용 시 잘못된 파일 경로나 연결 문자열은 SQL Server 서비스 중단을 유발할 수 있으니, 반드시 사전에 테스트 환경에서 검증하세요.

자주 묻는 질문 (FAQ)

OPENQUERY와 OPENROWSET의 가장 큰 차이는 무엇인가요?
OPENQUERY는 Linked Server를 사전에 설정한 후 원격 쿼리를 실행하는 방식이며, OPENROWSET은 즉석에서 연결 정보를 지정해 데이터를 조회하는 방식입니다.
OPENROWSET 사용 시 보안 설정이 필요한 이유는 무엇인가요?
Ad Hoc Distributed Queries 기능이 기본적으로 비활성화되어 있어 무단 접근을 막기 위함이며, 활성화 시에는 방화벽과 계정 권한을 철저히 제한해야 합니다.
Linked Server 없이도 외부 데이터를 조회할 수 있나요?
가능합니다. OPENROWSET을 사용하면 Linked Server 설정 없이도 외부 데이터 소스에 직접 연결할 수 있습니다.
OPENQUERY 실행 속도가 느린 경우 해결 방법은?
WHERE 절과 집계 연산을 원격 쿼리 내부에 포함시켜 전송 데이터량을 줄이고, 필요한 컬럼만 선택하여 불필요한 부하를 최소화하세요.
Excel 데이터를 SQL Server로 가져올 때 주의할 점은?
ACE OLEDB 드라이버 설치 여부를 확인하고, HDR=YES 설정으로 첫 행을 컬럼명으로 인식하게 해야 합니다.
OPENQUERY로 INSERT, UPDATE 같은 DML 문도 실행 가능한가요?
가능합니다. 단, 원격 서버가 해당 작업을 허용하도록 권한이 설정되어 있어야 하며, 트랜잭션 처리도 주의해야 합니다.
OPENROWSET 사용 시 발생하는 “Ad hoc access is not allowed” 오류는 어떻게 해결하나요?
sp_configure로 Ad Hoc Distributed Queries 옵션을 1로 설정하고 RECONFIGURE를 실행해야 합니다.
OPENQUERY와 OPENROWSET 중 어떤 것을 선택해야 하나요?
반복적이고 대량 데이터 조회는 OPENQUERY가 유리하며, 단발성 또는 테스트 목적이라면 OPENROWSET이 적합합니다.

📝 OPENQUERY와 OPENROWSET 활용 가이드 총정리

이번 글에서는 MSSQL 환경에서 OPENQUERYOPENROWSET를 활용해 외부 데이터에 접근하는 방법을 다뤘습니다.
두 함수는 모두 강력한 원격 데이터 조회 기능을 제공하지만, 사용 방식과 목적에서 뚜렷한 차이가 있습니다.
OPENQUERY는 Linked Server 기반으로 정기적이고 대량의 데이터 처리에 적합하며, OPENROWSET은 즉석 연결과 파일 기반 데이터 분석에 강점을 가집니다.
또한 Linked Server 설정 방법, 보안 설정, 성능 최적화 팁, 실전 예제까지 살펴보며, 다양한 업무 환경에서 즉시 적용 가능한 실용적인 정보를 제공했습니다.
이제 여러분은 상황에 맞는 함수를 선택해 보다 효율적으로 외부 데이터를 연동하고, 안정적인 데이터 통합 환경을 구축할 수 있을 것입니다.


🏷️ 관련 태그 : MSSQL, OPENQUERY, OPENROWSET, LinkedServer, SQL데이터연동, 외부데이터조회, 데이터통합, SQL성능최적화, 데이터베이스보안, SQL예제