Condividi tramite


bcp_moretext

Si applica a: SQL Server Database SQL di Azure Istanza gestita di SQL di Azure Azure Synapse Analytics Piattaforma di strumenti analitici (PDW)

Invia parte di un valore di tipo di dati long a lunghezza variabile a SQL Server.

Sintassi

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

Argomenti

hdbc
Handle di connessione ODBC abilitato per la copia bulk.

cbData
Numero di byte di dati copiati in SQL Server dai dati a cui fa riferimento pData. Un valore di SQL_NULL_DATA indica NULL.

pData
Puntatore al blocco di dati supportato, lungo e a lunghezza variabile da inviare a SQL Server.

Valori restituiti

SUCCEED o FAIL.

Osservazioni:

Questa funzione può essere usata insieme a bcp_bind e bcp_sendrow per copiare valori di dati di lunghezza variabile lunghi in SQL Server in diversi blocchi più piccoli. bcp_moretext può essere usato con colonne con i tipi di dati di SQL Server seguenti: text, ntext, image, varchar(max), nvarchar(max), varbinary(max), tipo definito dall'utente (UDT) e XML. bcp_moretext non supporta le conversioni di dati, i dati forniti devono corrispondere al tipo di dati della colonna di destinazione.

Se bcp_bind viene chiamato con un parametro pData non NULL per i tipi di dati supportati da bcp_moretext, bcp_sendrow invia l'intero valore di dati, indipendentemente dalla lunghezza. Se, tuttavia, bcp_bind dispone di un parametro pData NULL per i tipi di dati supportati, bcp_moretext può essere usato per copiare i dati immediatamente dopo una restituzione corretta da bcp_sendrow che indica che sono state elaborate colonne associate con dati presenti.

Se si usa bcp_moretext per inviare una colonna di tipo di dati supportata in una riga, è necessario usarla anche per inviare tutte le altre colonne di tipo di dati supportate nella riga. Non è possibile ignorare alcuna colonna. I tipi di dati supportati sono SQLTEXT, SQLNTEXT, SQLIMAGE, SQLUDT e SQLXML. Anche SQLCHARACTER, SQLVARCHAR, SQNCHAR, SQLBINARY e SQLVARBINARY rientrano in questa categoria se la colonna è di tipo varchar(max), nvarchar(max) o varbinary(max), rispettivamente.

La chiamata a bcp_bind o bcp_collen imposta la lunghezza totale di tutte le parti dati da copiare nella colonna di SQL Server. Un tentativo di inviare più byte di SQL Server rispetto a specificato nella chiamata a bcp_bind o bcp_collen genera un errore. Questo errore si verificherebbe, ad esempio, in un'applicazione che usava bcp_collen per impostare la lunghezza dei dati disponibili per una colonna di testo di SQL Server su 4500, quindi chiamato bcp_moretext cinque volte mentre indicava in ogni chiamata che la lunghezza del buffer di dati era lunga 1000 byte.

Se una riga copiata contiene più di una colonna lunga a lunghezza variabile, bcp_moretext prima invia i dati alla colonna numerata ordinale più bassa, seguita dalla colonna numerata ordinale più bassa successiva e così via. Una corretta impostazione della lunghezza totale dei dati previsti è importante. Non è possibile segnalare, al di fuori dell'impostazione della lunghezza, che tutti i dati per una colonna sono stati ricevuti dalla copia bulk.

Quando i valori var(max) vengono inviati al server usando bcp_sendrow e bcp_moretext, non è necessario chiamare bcp_collen per impostare la lunghezza della colonna. Per questi tipi, invece, il valore viene terminato chiamando bcp_sendrow con una lunghezza pari a zero.

Un'applicazione chiama in genere bcp_sendrow e bcp_moretext all'interno di cicli per inviare un numero di righe di dati. Ecco una descrizione di come eseguire questa operazione per una tabella contenente due colonne di testo :

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);  
  
}  
  

Esempio

Questo esempio illustra come usare bcp_moretext con bcp_bind e 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.  

Vedi anche

Funzioni di copia bulk