다음을 통해 공유


유니코드 데이터 및 서버 코드 페이지

적용 대상: SQL Server

Important

SQL Server의 이후 버전에서는 이 기능이 제거됩니다. 새 개발 작업에서는 이 기능을 사용하지 않도록 하고, 현재 이 기능을 사용하는 애플리케이션은 수정하세요. 대신 CLR 통합을 사용하세요.

확장 저장 프로시저 API는 유니코드 데이터에 대해 사용하도록 설정됩니다. 그러나 유니코드 메타데이터는 사용하도록 설정되지 않습니다. 유니코드 지시문은 #define 확장 저장 프로시저 API에 영향을 주지 않습니다.

확장 저장 프로시저 애플리케이션에 의해 반환되거나 확장 저장 프로시저 API에 제공되는 모든 메타데이터는 서버의 멀티바이트 코드 페이지에 있는 것으로 가정됩니다. 확장 저장 프로시저 API 서버 애플리케이션의 기본 코드 페이지는 애플리케이션이 실행 중인 컴퓨터의 ANSI 코드 페이지이며, 필드 매개 변수를 로 설정SRV_SPROC_CODEPAGE하여 호출 srv_pfield 하여 가져올 수 있습니다.

확장 저장 프로시저 API 애플리케이션이 유니코드를 사용하는 경우 이 데이터를 확장 저장 프로시저 API에 전달하기 전에 유니코드 메타데이터 열 이름, 오류 메시지 등을 멀티바이트 데이터로 변환해야 합니다.

예제

다음 확장 저장 프로시저는 설명된 유니코드 변환의 예를 제공합니다.

  • 열 데이터는 열이 SRVNVARCHAR로 설명되기 때문에 유니코드 데이터 srv_describe 로 전달됩니다.

  • 열 이름 메타데이터는 멀티바이트 데이터로 전달 srv_describe 됩니다.

    확장 저장 프로시저는 필드 매개 변수를 사용하여 SQL Server의 멀티바이트 코드 페이지를 가져오기 위해 SRV_SPROC_CODEPAGE 호출 srv_pfield 합니다.

  • 오류 메시지는 멀티바이트 데이터로 전달 srv_sendmsg 됩니다.

    __declspec(dllexport) RETCODE proc1(SRV_PROC * srvproc) {
        #define MAX_COL_NAME_LEN 25
        #define MAX_COL_DATA_LEN 50
        #define MAX_ERR_MSG_LEN 250
        #define MAX_SERVER_ERROR 20000
        #define XP_ERROR_NUMBER MAX_SERVER_ERROR + 1
    
        int retval;
        UINT serverCodePage;
        CHAR * szServerCodePage;
    
        WCHAR unicodeColumnName[MAX_COL_NAME_LEN];
        CHAR multibyteColumnName[MAX_COL_NAME_LEN];
    
        WCHAR unicodeColumnData[MAX_COL_DATA_LEN];
    
        WCHAR unicodeErrorMessage[MAX_ERR_MSG_LEN];
        CHAR multibyteErrorMessage[MAX_ERR_MSG_LEN];
    
        lstrcpyW(unicodeColumnName, L "column1");
        lstrcpyW(unicodeColumnData, L "column1 data");
        lstrcpyW(unicodeErrorMessage, L "No Error!");
    
        // Obtain server code page.
        szServerCodePage = srv_pfield(srvproc, SRV_SPROC_CODEPAGE, NULL);
        if (NULL != szServerCodePage)
            serverCodePage = atol(szServerCodePage);
        else { // Problem situation exists.
            srv_senddone(srvproc, (SRV_DONE_ERROR | SRV_DONE_MORE), 0, 0);
            return 1;
        }
    
        // Convert column name for Unicode to multibyte using the
        // server code page.
        retval = WideCharToMultiByte(
            serverCodePage, // code page
            0, // default
            unicodeColumnName, // wide-character string
            -1, // string is null terminated
            multibyteColumnName, // address of buffer for new string
            sizeof(multibyteColumnName), // size of buffer
            NULL, NULL);
    
        if (0 == retval) {
            lstrcpyW(unicodeErrorMessage, L "Conversion to multibyte
                failed.
                ");
                goto Error;
            }
    
            retval = srv_describe(srvproc, 1, multibyteColumnName,
                SRV_NULLTERM,
                SRVNVARCHAR, MAX_COL_DATA_LEN * sizeof(WCHAR), // destination
                SRVNVARCHAR, lstrlenW(unicodeColumnData) * sizeof(WCHAR),
                unicodeColumnData); //source
    
            if (FAIL == retval) {
                lstrcpyW(unicodeErrorMessage, L "srv_describe failed.");
                goto Error;
            }
    
            retval = srv_sendrow(srvproc);
            if (FAIL == retval) {
                lstrcpyW(unicodeErrorMessage, L "srv_sendrow failed.");
                goto Error;
            }
    
            retval = srv_senddone(srvproc, SRV_DONE_MORE | SRV_DONE_COUNT, 0, 1);
            if (FAIL == retval) {
                lstrcpyW(unicodeErrorMessage, L "srv_senddone failed.");
                goto Error;
            }
    
            return 0;
            Error:
                // convert error message from Unicode to multibyte.
                retval = WideCharToMultiByte(
                    serverCodePage, // code page
                    0, // default
                    unicodeErrorMessage, // wide-character string
                    -1, // string is null terminated
                    multibyteErrorMessage, // address of buffer for new string
                    sizeof(multibyteErrorMessage), // size of buffer
                    NULL, NULL);
    
            srv_sendmsg(srvproc, SRV_MSG_ERROR, XP_ERROR_NUMBER, SRV_INFO, 1,
                NULL, 0, __LINE__,
                multibyteErrorMessage,
                SRV_NULLTERM);
    
            srv_senddone(srvproc, (SRV_DONE_ERROR | SRV_DONE_MORE), 0, 0);
    
            return 1;
    }