다음을 통해 공유


OPENROWSET(Transact-SQL)

적용 대상: SQL Server 2016(13.x) 이상 버전

OPENROWSET 는 연결된 서버의 테이블에 액세스하는 대신 원격 데이터를 연결하고 액세스하는 일회성 임시 방법입니다. OPENROWSET T-SQL 명령에는 외부 데이터 원본에서 원격 데이터에 액세스하는 데 필요한 모든 연결 정보가 포함됩니다.

함수는 OPENROWSET 테이블 이름인 것처럼 쿼리 절에서 FROM 참조할 수 있습니다. 이 함수는 OPENROWSET 데이터 공급자의 INSERT기능에 따라 해당 UPDATEDELETE 함수를 또는 문의 대상 테이블로 참조할 수도 있습니다. 쿼리는 여러 결과 집합을 반환할 수 있지만 OPENROWSET은 첫 번째 결과 집합만 반환할 수 있습니다.

팁 (조언)

외부 데이터 원본에 대한 더 자주 참조하려면 대신 연결된 서버를 사용합니다. 자세한 내용은 연결된 서버(데이터베이스 엔진)를 참조하세요.

OPENROWSET 연산자가 BULK 없는 경우 SQL Server에서만 사용할 수 있습니다. 다른 플랫폼의 유사한 예제에 대한 세부 정보 및 링크:

  • OPENROWSET 는 Azure 및 Microsoft Fabric을 비롯한 많은 데이터베이스 엔진 플랫폼에서 기본 제공 BULK 공급자를 통해 대량 작업을 지원합니다. 자세한 내용은 OPENROWSET BULK(Transact-SQL)을 참조하세요.
  • Azure SQL Managed Instance에 대한 예제는 OPENROWSET을 사용하여 데이터 원본 쿼리를 참조하세요.
  • Azure SQL Database는 OPENROWSET BULK(Transact-SQL)만 지원합니다.
  • Azure Synapse의 서버리스 SQL 풀에 대한 정보 및 예제는 Azure Synapse Analytics에서 서버리스 SQL 풀을 사용하여 OPENROWSET을 사용하는 방법을 참조 하세요. Azure Synapse의 전용 SQL 풀은 이 함수를 OPENROWSET 지원하지 않습니다.

Transact-SQL 구문 표기 규칙

구문

OPENROWSET 구문은 외부 데이터 원본을 쿼리하는 데 사용됩니다.

OPENROWSET
(  'provider_name'
    , { 'datasource' ; 'user_id' ; 'password' | 'provider_string' }
    , {  [ catalog. ] [ schema. ] object | 'query' }
)

인수

'provider_name'

레지스트리에 지정된 데이터 공급자의 이름(또는 PROGID)을 나타내는 문자열입니다. provider_name에는 기본값이 없습니다. 공급자 이름의 예는 MSOLEDBSQL, Microsoft.Jet.OLEDB.4.0, MSDASQL입니다.

'datasource'

특정 데이터 원본에 해당하는 문자열 상수입니다. datasource 는 공급자를 DBPROP_INIT_DATASOURCE 초기화하기 위해 IDBProperties 공급자의 인터페이스에 전달할 속성입니다. 일반적으로 이 문자열에는 데이터베이스 파일의 이름, 데이터베이스 서버 이름 또는 공급자가 데이터베이스 또는 데이터베이스를 찾기 위해 이해하는 이름이 포함됩니다.

데이터 원본은 C:\SAMPLES\Northwind.mdb' 공급자의 경우 파일 경로 Microsoft.Jet.OLEDB.4.0이거나 Server=Seattle1;Trusted_Connection=yes; 공급자의 경우 연결 문자열 MSOLEDBSQL일 수 있습니다.

'user_id'

지정된 데이터 공급자에 전달된 사용자 이름인 문자열 상수입니다. user_id 연결에 대한 보안 컨텍스트를 지정하고 공급자를 초기화하는 속성으로 DBPROP_AUTH_USERID 전달됩니다. user_id Microsoft Windows 로그인 이름이 될 수 없습니다.

'password'

데이터 공급자에게 전달할 사용자 암호인 문자열 상수입니다. 암호 는 공급자를 초기화할 DBPROP_AUTH_PASSWORD 때 속성으로 전달됩니다. 암호 는 Microsoft Windows 암호일 수 없습니다. 예를 들어:

SELECT a.* FROM OPENROWSET(
    'Microsoft.Jet.OLEDB.4.0',
    'C:\SAMPLES\Northwind.mdb';
    '<user name>';
    '<password>',
    Customers
) AS a;

'provider_string'

OLE DB 공급자를 초기화하는 속성으로 DBPROP_INIT_PROVIDERSTRING 전달되는 공급자별 연결 문자열. provider_string은 일반적으로 공급자를 초기화하는 데 필요한 모든 연결 정보를 캡슐화합니다.

SQL Server Native Client OLE DB 공급자가 인식하는 키워드 목록은 초기화 및 권한 부여 속성(Native Client OLE DB 공급자)을 참조하세요. SQL Server Native Client(약칭 SNAC)는 SQL Server 2022(16.x) 및 SQL Server Management Studio 19(SSMS)에서 제거되었습니다. SQL Server Native Client OLE DB 공급자(SQLNCLI 또는 SQLNCLI11)와 레거시 Microsoft OLE DB Provider for SQL Server(SQLOLEDB)는 모두 새로운 개발에 권장되지 않습니다. 앞으로 SQL Server용 새 Microsoft OLE DB 드라이버(MSOLEDBSQL)로 전환합니다.

SELECT d.* FROM OPENROWSET(
    'MSOLEDBSQL',
    'Server=Seattle1;Trusted_Connection=yes;',
    Department
) AS d;

[ 카탈로그. ] [ 스키마. ] 개체

OPENROWSET이 읽어야 하는 데이터를 포함하는 원격 테이블 또는 뷰입니다. 이름이 다음과 같은 3개의 구성 요소로 이루어진 개체일 수 있습니다.

  • catalog(선택 사항) - 지정한 개체가 있는 카탈로그 또는 데이터베이스의 이름입니다.
  • schema(선택 사항) - 지정한 개체에 대한 스키마 또는 개체 소유자의 이름입니다.
  • object - 작업할 개체를 고유하게 식별하는 개체 이름입니다.
SELECT d.* FROM OPENROWSET(
    'MSOLEDBSQL',
    'Server=Seattle1;Trusted_Connection=yes;',
    AdventureWorks2022.HumanResources.Department
) AS d;

'query'

공급자가 보내고 실행하는 문자열 상수입니다. SQL Server의 로컬 인스턴스는 이 쿼리를 처리하지 않지만 통과 쿼리인 공급자가 반환한 쿼리 결과를 처리합니다. 통과 쿼리는 테이블 이름을 통해 테이블 형식 데이터를 사용할 수 없지만 명령 언어를 통해서만 사용할 수 있는 공급자에서 사용할 때 유용합니다. 쿼리 공급자가 OLE DB 명령 개체와 해당 필수 인터페이스를 지원하는 경우에는 원격 서버에서 통과 쿼리를 사용할 수 있습니다.

자세한 내용은 SQL Server Native Client(OLE DB) 인터페이스를 참조하세요.

SELECT a.*
FROM OPENROWSET(
    'MSOLEDBSQL',
    'Server=Seattle1;Trusted_Connection=yes;',
    'SELECT TOP 10 GroupName, Name FROM AdventureWorks2022.HumanResources.Department'
) AS a;

설명

OPENROWSET는 지정된 공급자에 대해 명시적으로 DisallowAdhocAccess 레지스트리 옵션을 0으로 설정하고 Ad Hoc Distributed Queries 고급 구성 옵션을 설정할 때만 OLE DB 데이터 원본에서 원격 데이터에 액세스하는 데 사용할 수 있습니다. 이러한 옵션이 설정되지 않은 경우 기본 동작은 임시 액세스를 허용하지 않습니다.

원격 OLE DB 데이터 원본에 액세스하는 경우 신뢰할 수 있는 연결의 로그인 ID는 클라이언트가 쿼리되는 서버에 연결된 서버에서 자동으로 위임되지 않습니다. 이 경우 인증 위임을 구성해야 합니다.

데이터 공급자가 지정된 데이터 원본에서 여러 카탈로그 및 스키마를 지원하는 경우 카탈로그 및 스키마 이름이 필요합니다. catalog schema 데이터 공급자가 해당 값을 지원하지 않는 경우 값을 생략할 수 있습니다. 공급자가 스키마 이름만 지원하는 경우 양식 schema.object 의 두 부분으로 된 이름을 지정해야 합니다. 공급자가 카탈로그 이름만 지원하는 경우 양식 catalog.schema.object 의 세 부분으로 된 이름을 지정해야 합니다. 자세한 내용은 Transact-SQL 구문 표기 규칙을 참조하세요.

SQL Server Native Client OLE DB 공급자를 사용하는 통과 쿼리에는 세 부분으로 구성된 이름이 필요합니다.

OPENROWSET 에서는 해당 인수에 대한 변수를 허용하지 않습니다.

OPENDATASOURCE 절에서 OPENQUERY, OPENROWSET 또는 FROM에 대한 모든 호출은 두 호출에 동일한 인수가 제공되는 경우에도 업데이트의 대상으로 사용되는 함수에 대한 호출과는 개별적이고 독립적으로 평가됩니다. 특히 이러한 호출 중 하나의 결과에 적용되는 필터 또는 조인 조건은 다른 호출의 결과에 영향을 미치지 않습니다.

사용 권한

OPENROWSET 사용 권한은 데이터 공급자에 전달되는 사용자 이름의 권한에 따라 결정됩니다.

예제

이 섹션에서는 OPENROWSET을 사용하는 방법을 보여 주는 일반적인 예제를 제공합니다.

참고 항목

사용을 INSERT...SELECT * FROM OPENROWSET(BULK...)보여 주는 예제는 OPENROWSET BULK(Transact-SQL)을 참조하세요.

SQL Server Native Client(약칭 SNAC)는 SQL Server 2022(16.x) 및 SQL Server Management Studio 19(SSMS)에서 제거되었습니다. SQL Server Native Client OLE DB 공급자(SQLNCLI 또는 SQLNCLI11)와 레거시 Microsoft OLE DB Provider for SQL Server(SQLOLEDB)는 모두 새로운 개발에 권장되지 않습니다. 앞으로 SQL Server용 새 Microsoft OLE DB 드라이버(MSOLEDBSQL)로 전환합니다.

A. SELECT 및 SQL Server Native Client OLE DB 공급자와 함께 OPENROWSET 사용

다음 예에서는 SQL Server Native Client OLE DB 공급자를 사용하여 HumanResources.Department 원격 서버에서 AdventureWorks2022 데이터베이스의 Seattle1 테이블에 액세스합니다. (대체된 최신 Microsoft SQL Server OLE DB 데이터 공급자에 MSOLEDBSQL사용SQLNCLI) SELECT 문은 반환되는 행 집합을 정의하는 데 사용됩니다. 공급자 문자열에는 ServerTrusted_Connection 키워드가 포함됩니다. 이러한 키워드는 SQL Server Native Client OLE DB 공급자가 인식합니다.

SELECT a.*
FROM OPENROWSET(
    'MSOLEDBSQL', 'Server=Seattle1;Trusted_Connection=yes;',
    'SELECT GroupName, Name, DepartmentID
         FROM AdventureWorks2022.HumanResources.Department
         ORDER BY GroupName, Name'
) AS a;

B. Microsoft OLE DB Provider for Jet 사용

다음 예에서는 Microsoft OLE DB Provider for Jet을 사용하여 Microsoft Access Customers 데이터베이스의 Northwind 테이블에 액세스합니다.

참고 항목

이 예제에서는 Microsoft Access가 설치되어 있다고 가정합니다. 이 예제를 실행하려면 데이터베이스를 Northwind 설치해야 합니다.

SELECT CustomerID, CompanyName
FROM OPENROWSET(
    'Microsoft.Jet.OLEDB.4.0',
    'C:\Program Files\Microsoft Office\OFFICE11\SAMPLES\Northwind.mdb';
    'admin';'',
    Customers
);

C. INNER JOIN에서 OPENROWSET 및 다른 테이블 사용

다음 예제에서는 SQL Server 데이터베이스의 Customers 로컬 인스턴스 및 동일한 컴퓨터에 저장된 Microsoft Access Northwind 데이터베이스의 Orders 테이블에서 테이블의 모든 데이터를 Northwind 선택합니다.

참고 항목

이 예제에서는 Microsoft Access가 설치되어 있다고 가정합니다. 이 예제를 실행하려면 데이터베이스를 Northwind 설치해야 합니다.

USE Northwind;
GO

SELECT c.*, o.*
FROM Northwind.dbo.Customers AS c
INNER JOIN OPENROWSET(
        'Microsoft.Jet.OLEDB.4.0',
        'C:\Program Files\Microsoft Office\OFFICE11\SAMPLES\Northwind.mdb';'admin';'',
        Orders) AS o
    ON c.CustomerID = o.CustomerID;