확장 저장 프로시저 만들기
중요 |
---|
Microsoft SQL Server의 이후 버전에서는 이 기능이 제거됩니다. 새 개발 작업에서는 이 기능을 사용하지 말고, 현재 이 기능을 사용하는 응용 프로그램은 가능한 한 빨리 수정하십시오. 대신 CLR 통합을 사용하십시오. |
확장 저장 프로시저는 프로토타입이 다음과 같은 함수입니다.
SRVRETCODE xp_extendedProcName **(**SRVPROC *);
접두사 **xp_**는 필요에 따라 사용할 수 있습니다. 확장 저장 프로시저의 이름은 서버에 설치된 코드 페이지/정렬 순서에 관계없이 Transact-SQL 문에서 참조할 때는 대/소문자를 구분합니다. DLL을 빌드하는 경우 다음 작업을 수행합니다.
진입점이 필요하면 DllMain 함수를 작성합니다.
이 함수는 옵션입니다. 원본 코드에서 이 함수를 제공하지 않으면 컴파일러가 자체 버전에 연결하며 이 경우 아무 작업도 수행되지 않고 TRUE가 반환됩니다. DllMain 함수를 제공하면 스레드나 프로세스가 DLL에 연결되거나 DLL에서 분리될 때 운영 체제에서 이 함수를 호출합니다.
DLL 외부에서 호출된 모든 함수(모든 확장 저장 프로시저 Efunction)는 내보내야 합니다.
함수를 내보내려면 .def 파일의 EXPORTS 섹션에서 해당 함수 이름을 나열하거나 원본 코드에서 Microsoft 컴파일러 확장인 __declspec(dllexport)을 함수 이름 앞에 추가합니다. 여기서 __declspec() 맨 앞의 밑줄은 두 개입니다.
확장 저장 프로시저 DLL을 만드는 데 필요한 파일은 다음과 같습니다.
파일 |
설명 |
---|---|
Srv.h |
확장 저장 프로시저 API 헤더 파일 |
Opends60.lib |
Opends60.dll용 가져오기 라이브러리 |
확장 저장 프로시저 DLL을 만들려면 동적 연결 라이브러리 형식의 프로젝트를 만듭니다. DLL을 만드는 방법은 개발 환경 설명서를 참조하십시오.
모든 확장 저장 프로시저 DLL에서 다음 함수를 구현하고 내보내는 것이 좋습니다.
__declspec(dllexport) ULONG __GetXpVersion()
{
return ODS_VERSION;
}
[!참고]
__declspec(dllexport)은 Microsoft 전용 컴파일러 확장입니다. 컴파일러에서 이 지시어를 지원하지 않으면 DEF 파일의 EXPORTS 섹션 아래에서 이 함수를 내보내야 합니다.
추적 플래그 -T260으로 SQL Server가 시작되었거나 시스템 관리자 권한이 있는 사용자가 DBCC TRACEON(260)을 실행하는데 확장 저장 프로시저 DLL이 __GetXpVersion()을 지원하지 않을 경우 경고 메시지 '오류 8131: 확장 저장 프로시저 DLL '%'이(가) __GetXpVersion()을 내보내지 않습니다.'가 오류 로그에 출력됩니다. 여기서 __GetXpVersion() 맨 앞의 밑줄은 두 개입니다.
확장 저장 프로시저 DLL이 __GetXpVersion()을 내보내지만 함수에서 반환하는 버전이 서버에 필요한 버전보다 낮을 경우 함수에서 반환한 버전과 서버에 필요한 버전을 알리는 경고 메시지가 오류 로그에 출력됩니다. 이 메시지가 표시되면 __GetXpVersion()에서 잘못된 값을 반환하고 있거나 이전 버전 srv.h를 사용하여 컴파일하고 있음을 나타냅니다.
[!참고]
Microsoft Win32 함수인 SetErrorMode는 확장 저장 프로시저 내에서 호출하지 않아야 합니다.
장기 실행 확장 저장 프로시저의 경우 연결이 끊기거나 일괄 처리가 중단될 경우 프로시저가 자동으로 종료될 수 있도록 주기적으로 srv_got_attention을 호출하는 것이 좋습니다.
확장 저장 프로시저 DLL을 디버깅하려면 DLL을 SQL Server\Binn 디렉터리에 복사합니다. 디버깅 세션에 사용할 실행 파일을 지정하려면 MicrosoftSQL Server 실행 파일(예: C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\Binn\Sqlservr.exe)의 경로와 파일 이름을 입력합니다. sqlservr 인수에 대한 자세한 내용은 sqlservr 응용 프로그램을 참조하십시오.