다음을 통해 공유


bcp_moretext

긴 가변 길이 데이터 형식 값의 일부를 SQL Server로 보냅니다.

구문

RETCODE bcp_moretext (
        HDBC hdbc,
        DBINT cbData,
        LPCBYTE pData);

인수

  • hdbc
    대량 복사가 가능한 ODBC 연결 핸들입니다.

  • cbData
    pData가 참조하는 데이터에서 SQL Server로 복사되는 데이터의 바이트 수입니다. SQL_NULL_DATA 값은 NULL을 나타냅니다.

  • pData
    SQL Server로 보낼 지원되는 긴 가변 길이 데이터 청크에 대한 포인터입니다.

반환 값

SUCCEED 또는 FAIL

주의

이 함수를 bcp_bindbcp_sendrow와 함께 사용하여 긴 가변 길이 데이터 값을 보다 작은 많은 청크로 SQL Server에 복사할 수 있습니다. bcp_moretext는 text, ntext, image, varchar(max), nvarchar(max), varbinary(max), UDT(사용자 정의 형식) 및 XML과 같은 SQL Server 데이터 형식을 가진 열에 사용할 수 있습니다. bcp_moretext는 데이터 변환을 지원하지 않으며, 제공된 데이터가 대상 열의 데이터 형식과 일치해야 합니다.

bcp_moretext에서 지원되는 데이터 형식에 대해 NULL이 아닌 pData 매개 변수를 사용하여 bcp_bind를 호출하면 bcp_sendrow에서 길이에 관계없이 전체 데이터 값을 보냅니다. 하지만 지원되는 데이터 형식에 대해 bcp_bind에 NULL pData 매개 변수가 있는 경우 데이터가 있는 바인딩된 모든 열이 처리되었음을 나타내는 bcp_sendrow에서의 성공적인 반환 후에 즉시 bcp_moretext를 사용하여 데이터를 복사할 수 있습니다.

bcp_moretext를 사용하여 행의 지원되는 데이터 형식 열을 하나 보내는 경우 bcp_moretext를 사용하여 해당 행의 다른 지원되는 데이터 형식 열도 모두 보내야 합니다. 열을 건너뛸 수 없습니다. 지원되는 데이터 형식은 SQLTEXT, SQLNTEXT, SQLIMAGE, SQLUDT 및 SQLXML입니다. 열이 각각 varchar(max), nvarchar(max) 또는 varbinary(max)인 경우 SQLCHARACTER, SQLVARCHAR, SQNCHAR, SQLBINARY 및 SQLVARBINARY도 이 범주에 해당합니다.

bcp_bind 또는 bcp_collen에서 호출하면 SQL Server 열로 복사할 모든 데이터 부분의 총 길이가 설정됩니다. bcp_bind 또는 bcp_collen에 대한 호출에 지정된 것보다 많은 바이트를 SQL Server로 보내려고 하면 오류가 생성됩니다. 예를 들어 bcp_collen을 사용하여 SQL Server text 열에 사용 가능한 데이터 길이를 4500으로 설정한 다음 각 호출에서 데이터 버퍼 길이가 1000바이트라고 표시하여 bcp_moretext를 5번 호출한 응용 프로그램에서 이 오류가 발생합니다.

복사한 행에 긴 가변 길이 열이 두 개 이상 있을 경우 bcp_moretext는 먼저 서수 번호가 가장 낮은 열에 해당 데이터를 보낸 후 서수 번호가 다음으로 가장 낮은 열순으로 데이터를 보냅니다. 필요한 데이터의 총 길이를 올바르게 설정하는 것이 중요합니다. 길이 설정 외에는 대량 복사에서 열의 모든 데이터가 수신되었음을 나타낼 방법이 없습니다.

bcp_sendrowbcp_moretext를 사용하여 var(max) 값을 서버로 보내는 경우에는 bcp_collen을 호출하여 열 길이를 설정할 필요가 없습니다. 대신 이러한 형식에 대해서만 길이 0으로 bcp_sendrow를 호출하여 값이 종료됩니다.

응용 프로그램은 일반적으로 루프 내에서 bcp_sendrowbcp_moretext를 호출하여 많은 데이터 행을 보냅니다. 두 개의 text 열이 포함된 테이블에 대해 이 작업을 수행하는 방법의 개요는 다음과 같습니다.

while (there are still rows to send)
{
bcp_sendrow(...);

for (all the data in the first varbinary(max) column)
bcp_moretext(...);
bcp_moretext(hdbc, 0, NULL);

for (all the data in the second varbinary(max) column)
bcp_moretext(...);
bcp_moretext(hdbc, 0, NULL);

}

이 예에서는 bcp_bindbcp_sendrow와 함께 bcp_moretext를 사용하는 방법을 보여 줍니다.

// Variables like henv not specified.
HDBC      hdbc;
DBINT      idRow = 5;
char*      pPart1 = "This text value isn't very long,";
char*      pPart2 = " but it's broken into three parts";
char*      pPart3 = " anyhow.";
DBINT      cbAllParts;
DBINT      nRowsProcessed;
 
// Application initiation, get an ODBC environment handle, allocate the
// hdbc, and so on.
... 

// Enable bulk copy prior to connecting on allocated hdbc.
SQLSetConnectAttr(hdbc, SQL_COPT_SS_BCP, (SQLPOINTER) SQL_BCP_ON,
   SQL_IS_INTEGER);

// Connect to the data source, return on error.
if (!SQL_SUCCEEDED(SQLConnect(hdbc, _T("myDSN"), SQL_NTS,
   _T("myUser"), SQL_NTS, _T("myPwd"), SQL_NTS)))
   {
   // Raise error and return.
   return;
   }

// Initialize bulk copy. 
if (bcp_init(hdbc, "comdb..articles", NULL, NULL, DB_IN) == FAIL)
   {
   // Raise error and return.
   return;
   }

// Bind program variables to table columns. 
if (bcp_bind(hdbc, (LPCBYTE) &idRow, 0, SQL_VARLEN_DATA, NULL, 0,
   SQLINT4, 1)    == FAIL)
   {
   // Raise error and return.
   return;
   }

cbAllParts = (DBINT) (strnlen(pPart1, sizeof(pPart1) + 1) + strnlen(pPart2, sizeof(pPart2) + 1) + strnlen(pPart3, sizeof(pPart3) + 1));
if (bcp_bind(hdbc, NULL, 0, cbAllParts, NULL, 0, SQLTEXT, 2) == FAIL)
   {
   // Raise error and return.
   return;
   }

// Send this row, with the text value broken into three chunks. 
if (bcp_sendrow(hdbc) == FAIL)
   {
   // Raise error and return.
   return;
   }

if (bcp_moretext(hdbc, (DBINT) strnlen(pPart1, sizeof(pPart1) + 1), pPart1) == FAIL)
   {
   // Raise error and return.
   return;
   }
if (bcp_moretext(hdbc, (DBINT) strnlen(pPart2, sizeof(pPart2) + 1), pPart2) == FAIL)
   {
   // Raise error and return.
   return;
   }
if (bcp_moretext(hdbc, (DBINT) strnlen(pPart3, sizeof(pPart3) + 1), pPart3) == FAIL)
   {
   // Raise error and return.
   return;
   }

// All done. Get the number of rows processed (should be one).
nRowsProcessed = bcp_done(hdbc);

// Carry on.

참고 항목

참조