다음을 통해 공유


저장 프로시저 - SQL Server Native Client에서 호출

적용 대상: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System(PDW)

Important

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

저장 프로시저에는 0개 이상의 매개 변수가 있을 수 있습니다. 값을 반환할 수도 있습니다. SQL Server Native Client OLE DB 공급자를 사용하는 경우 저장 프로시저에 대한 매개 변수는 다음을 통해 전달될 수 있습니다.

  • 데이터 값을 하드 코딩합니다.

  • 매개 변수 표식(?)을 사용하여 매개 변수를 지정하고, 프로그램 변수를 매개 변수 표식에 바인딩한 다음, 데이터 값을 프로그램 변수에 배치합니다.

참고 항목

OLE DB로 명명된 매개 변수를 사용하여 SQL Server 저장 프로시저를 호출할 때 매개 변수 이름은 ‘@’ 문자로 시작해야 합니다. SQL Server 관련 제한 사항입니다. SQL Server Native Client OLE DB 공급자는 MDAC보다 이 제한을 더 엄격하게 적용합니다.

매개 변수 지원을 위해 ICommandWithParameters 인터페이스가 명령 개체에 표시됩니다. 매개 변수를 사용하기 위해 소비자는 먼저 ICommandWithParameters::SetParameterInfo 메서드를 호출하여 공급자에 대한 매개 변수를 설명합니다(또는 필요에 따라 GetParameterInfo 메서드를 호출하는 호출 문을 준비). 그런 다음 소비자는 버퍼의 구조를 지정하는 접근자를 만들고 매개 변수 값을 이 버퍼에 넣습니다. 마지막으로 접근자의 핸들과 버퍼에 대한 포인터를 Execute전달합니다. 나중에 Execute를 호출할 때 소비자는 버퍼에 새 매개 변수 값을 배치하고 접근자 핸들 및 버퍼 포인터를 사용하여 Execute를 호출합니다.

매개 변수를 사용하여 임시 저장 프로시저를 호출하는 명령은 먼저 ICommandWithParameters::SetParameterInfo를 호출하여 매개 변수 정보를 정의해야 명령을 성공적으로 준비할 수 있습니다. 임시 저장 프로시저의 내부 이름이 클라이언트에서 사용하는 외부 이름과 다르고 SQLOLEDB가 시스템 테이블을 쿼리하여 임시 저장 프로시저에 대한 매개 변수 정보를 확인할 수 없기 때문입니다.

다음은 매개 변수 바인딩 프로세스의 단계입니다.

  1. DBPARAMBINDINFO 구조의 배열에 매개 변수 정보를 입력합니다. 즉, 매개 변수 이름, 매개 변수의 데이터 형식에 대한 공급자별 이름 또는 표준 데이터 형식 이름 등입니다. 배열의 각 구조는 하나의 매개 변수를 설명합니다. 그런 다음 이 배열이 SetParameterInfo 메서드에 전달됩니다.

  2. ICommandWithParameters::SetParameterInfo 메서드를 호출하여 공급자에 대한 매개 변수를 설명합니다. SetParameterInfo는 각 매개 변수의 네이티브 데이터 형식을 지정합니다. SetParameterInfo 인수는 다음과 같습니다.

    • 형식 정보를 설정할 매개 변수 수입니다.

    • 형식 정보를 설정할 매개 변수 서수의 배열입니다.

    • DBPARAMBINDINFO 구조의 배열

  3. IAccessor::CreateAccessor 명령을 사용하여 매개 변수 접근자를 만듭니다. 이 접근자는 버퍼의 구조를 지정하고 매개 변수 값을 버퍼에 넣습니다. CreateAccessor 명령은 바인딩 집합에서 접근자를 만듭니다. 이러한 바인딩은 DBBINDING 구조의 배열을 사용하여 소비자가 설명합니다. 각 바인딩은 단일 매개 변수를 소비자의 버퍼에 연결하고 다음과 같은 정보를 포함합니다.

    • 바인딩이 적용되는 매개 변수의 서수

    • 바인딩된 항목(데이터 값, 길이 및 상태)입니다.

    • 버퍼의 각 파트에 대한 오프셋입니다.

    • 소비자의 버퍼에 있는 데이터 값의 길이 및 형식입니다.

    접근자는 HACCESSOR 형식인 핸들로 식별됩니다. 이 핸들은 CreateAccessor 메서드에서 반환됩니다. 소비자가 접근자 사용을 완료할 때마다 소비자는 ReleaseAccessor 메서드를 호출하여 보유하는 메모리를 해제해야 합니다.

    소비자가 ICommand::Execute와 같은 메서드를 호출하면 핸들을 접근자 및 버퍼 자체에 대한 포인터로 전달합니다. 공급자는 이 접근자를 사용하여 버퍼에 포함된 데이터를 전송하는 방법을 결정합니다.

  4. DBPARAMS 구조를 채웁니다. 입력 매개 변수 값이 생성되고 출력 매개 변수 값이 기록되는 소비자 변수는 런타임 에 DBPARAMS 구조에서 ICommand::Execute 에 전달됩니다. DBPARAMS 구조에는 다음 세 가지 요소가 포함됩니다.

    • 접근자 핸들에 의해 지정된 바인딩에 따라 공급자가 입력 매개 변수 데이터를 가져오고 출력 매개 변수 데이터를 반환하는 버퍼에 대한 포인터

    • 버퍼에 있는 매개 변수 집합의 수

    • 3단계에서 만든 접근자 핸들입니다.

  5. ICommand::Execute를 사용하여 명령을 실행합니다.

저장 프로시저를 호출하는 메서드

SQL Server에서 저장 프로시저를 실행할 때 SQL Server Native Client OLE DB 공급자는 다음을 지원합니다.

  • ODBC CALL 이스케이프 시퀀스입니다.

  • RPC(원격 프로시저 호출) 이스케이프 시퀀스입니다.

  • Transact-SQL EXECUTE 문

ODBC CALL 이스케이프 시퀀스

매개 변수 정보를 알고 있는 경우 ICommandWithParameters::SetParameterInfo 메서드를 호출하여 공급자에 대한 매개 변수를 설명합니다. 그렇지 않은 경우 저장 프로시저 호출에 ODBC CALL 구문을 사용하면 공급자는 도우미 함수를 호출하여 저장 프로시저 매개 변수 정보를 찾습니다.

매개 변수 정보(매개 변수 메타데이터)가 확실하지 않을 경우에는 ODBC CALL 구문을 사용하는 것이 좋습니다.

ODBC CALL 이스케이프 시퀀스를 사용하여 프로시저를 호출하는 일반적인 구문은 다음과 같습니다.

{[?=]callprocedure_name[([parameter][,[parameter]]...)]}

예시:

{call SalesByCategory('Produce', '1995')}  

RPC 이스케이프 시퀀스

RPC 이스케이프 시퀀스는 저장 프로시저를 호출하는 ODBC CALL 구문과 유사합니다. 프로시저를 여러 번 호출하는 경우 RPC 이스케이프 시퀀스는 저장 프로시저를 호출하는 세 가지 방법 중에서 가장 최적의 성능을 제공합니다.

RPC 이스케이프 시퀀스를 사용하여 저장 프로시저를 실행하는 경우 공급자는 도우미 함수를 호출하여 매개 변수 정보를 결정하지 않습니다(ODBC CALL 구문의 경우와 같이). RPC 구문은 ODBC CALL 구문보다 간단하므로 명령을 더 빠르게 구문 분석하여 성능을 향상합니다. 이 경우 ICommandWithParameters::SetParameterInfo를 실행하여 매개 변수 정보를 제공해야 합니다.

RPC 이스케이프 시퀀스에서는 반환 값이 있어야 합니다. 저장 프로시저에서 값을 반환하지 않으면 서버는 기본적으로 0을 반환합니다. 또한 저장 프로시저에서 SQL Server 커서를 열 수 없습니다. 저장 프로시저가 암시적으로 준비되고 ICommandPrepare::P repare 호출이 실패합니다. RPC 호출을 준비할 수 없기 때문에 열 메타데이터를 쿼리할 수 없습니다. 따라서 IColumnsInfo::GetColumnInfo 및 IColumnsRowset::GetColumnsRowset에서 DB_E_NOTPREPARED를 반환합니다.

모든 매개 변수 메타데이터를 알고 있는 경우 저장 프로시저를 실행하는 데 RPC 이스케이프 시퀀스를 사용하는 것이 좋습니다.

저장 프로시저를 호출하기 위한 RPC 이스케이프 시퀀스의 예입니다.

{rpc SalesByCategory}  

RPC 이스케이프 시퀀스를 보여 주는 샘플 애플리케이션은 저장 프로시저 실행(RPC 구문 사용) 및 반환 코드와 출력 매개 변수 처리(OLE DB)를 참조하세요.

Transact-SQL EXECUTE 문

ODBC CALL 이스케이프 시퀀스와 RPC 이스케이프 시퀀스는 EXECUTE 문이 아닌 저장 프로시저를 호출하는 데 선호되는 메서드입니다. SQL Server Native Client OLE DB 공급자는 SQL Server의 RPC 메커니즘을 사용하여 명령 처리를 최적화합니다. 이 RPC 프로토콜은 서버에서 수행된 매개 변수 처리 및 문 구문 분석의 대부분을 제거하여 성능을 향상합니다.

Transact-SQL EXECUTE 문의 예입니다.

EXECUTE SalesByCategory 'Produce', '1995'  

참고 항목

저장 프로시저