bcp_moretext
적용 대상: SQL Server Azure SQL 데이터베이스 Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System(PDW)
긴 가변 길이 데이터 형식 값의 일부를 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_bind 및 bcp_sendrow 함께 사용하여 긴 가변 길이 데이터 값을 여러 개의 작은 청크로 SQL Server에 복사할 수 있습니다. bcp_moretext 텍스트, 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_moretext 데이터가 있는 바인딩된 열이 처리되었음을 나타내는 bcp_sendrow 성공적으로 반환된 직후 데이터를 복사하는 데 사용할 수 있습니다.
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 텍스트 열에 사용 가능한 데이터의 길이를 4500으로 설정한 다음, 각 호출에서 데이터 버퍼 길이가 1000바이트 길이임을 나타내는 동안 bcp_moretext 5번 호출된 애플리케이션에서 발생합니다.
복사된 행에 긴 가변 길이 열 이 두 개 이상 포함된 경우 bcp_moretext 먼저 데이터를 가장 낮은 서수 번호가 매겨진 열로 보낸 다음, 다음으로 낮은 서수로 번호가 매겨진 열로 보냅니다. 예상 데이터의 총 길이를 올바르게 설정하는 것이 중요합니다. 열에 대한 모든 데이터가 대량 복사를 통해 수신되었음을 길이 설정 외부에서 알릴 수 있는 방법은 없습니다.
var(max) 값이 bcp_sendrow 사용하여 서버로 전송되고 bcp_moretext 경우 열 길이를 설정하기 위해 bcp_collen 호출할 필요가 없습니다. 대신 이러한 형식에 대해서만 길이가 0인 bcp_sendrow 호출하여 값이 종료됩니다.
애플리케이션은 일반적으로 bcp_sendrow 호출하고 루프 내에서 bcp_moretext 여러 데이터 행을 보냅니다. 다음은 두 개의 텍스트 열이 포함된 테이블에 대해 이 작업을 수행하는 방법에 대한 개요입니다.
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_bind 및 bcp_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.