Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
gäller för:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Skickar en del av ett långt, variabelt längdvärde för datatyp till SQL Server.
Syntax
RETCODE bcp_moretext (
HDBC hdbc,
DBINT cbData,
LPCBYTE pData);
Arguments
hdbc
Är den masskopieringsaktiverade ODBC-anslutningshandtaget.
cbData
Är antalet byte data som kopieras till SQL Server från data som refereras till av pData. Ett värde på SQL_NULL_DATA indikerar NULL.
pData (på engelska)
Är en pekare till den stödda, långa, variabel längd datachunk som ska skickas till SQL Server.
Returns
SUCCEED eller FAIL.
Remarks
Denna funktion kan användas tillsammans med bcp_bind och bcp_sendrow för att kopiera långa, variabellängds datavärden till SQL Server i ett antal mindre bitar. bcp_moretext kan användas med kolumner som har följande SQL Server datatyper: text, ntext, bild, varchar(max),nvarchar(max),varbinär(max), användardefinierad typ (UDT) och XML. bcp_moretext inte stöder datakonverteringar måste den tillhandahållna datan matcha datatypen för målkolumnen.
Om bcp_bind anropas med en icke-NULL pData-parameter för datatyper som stöds av bcp_moretext, skickar bcp_sendrow hela datavärdet, oavsett längd. Om bcp_bind däremot har en NULL pData-parameter för stödda datatyper kan bcp_moretext användas för att kopiera data omedelbart efter en lyckad retur från bcp_sendrow vilket indikerar att eventuella bundna kolumner med närvarande data har bearbetats.
Om du använder bcp_moretext för att skicka en kolumn med stödd datatyp i en rad, måste du också använda den för att skicka alla andra stödda datatypkolumner i raden. Inga kolumner får hoppas över. Stödda datatyper är SQLTEXT, SQLNTEXT, SQLIMAGE, SQLUDT och SQLXML. SQLCHARACTER, SQLVARCHAR, SQNCHAR, SQLBINARY och SQLVARBINARY faller också in i denna kategori om kolumnen är varchar(max), nvarchar(max) eller varbinary(max), respektive.
Att anropa antingen bcp_bind eller bcp_collen sätter den totala längden av alla datadelar som ska kopieras till kolumnen SQL Server. Ett försök att skicka SQL Server fler byte än vad som anges i anropet till bcp_bind eller bcp_collen genererar ett fel. Detta fel skulle till exempel uppstå i en applikation som använde bcp_collen för att ställa in längden på tillgänglig data för en SQL Server textkolumn till 4500, och sedan anropade bcp_moretext fem gånger samtidigt som det vid varje anrop indikerade att databuffertens längd var 1000 byte lång.
Om en kopierad rad innehåller mer än en lång, variabel kolumn skickar bcp_moretext först sina data till den lägsta ordinnumrerade kolumnen, följt av nästa lägsta ordinarie numrerade kolumn, och så vidare. Korrekt inställning av den totala längden av förväntad data är viktig. Det finns inget sätt att signalera, utanför längdinställningen, att all data för en kolumn har mottagits med masskopia.
När var(max)- värden skickas till servern med bcp_sendrow och bcp_moretext är det inte nödvändigt att anropa bcp_collen för att ställa in kolumnlängden. Istället avslutas värdet endast för dessa typer genom att anropa bcp_sendrow med längden noll.
En applikation anropar normalt bcp_sendrow och bcp_moretext inom loopar för att skicka ett antal datarader. Här är en översikt över hur man gör detta för en tabell som innehåller två textkolumner :
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);
}
Example
Detta exempel visar hur man använder bcp_moretext med bcp_bind och bcp_sendrow:
// 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.