Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Questo articolo illustra il tipo di dati SQL vettoriale implementato da Microsoft ODBC Driver per SQL Server a partire dalla versione 18.6.1.1. Questo documento descrive il comportamento del driver Microsoft per il vettore e fornisce indicazioni sull'utilizzo, note specifiche dell'API e frammenti di codice. Per una panoramica dei tipi di dati vettoriali, vedere Tipo di dati Vector.
Informazioni generali
Microsoft ODBC Driver per SQL Server supporta in modo nativo il tipo di dati vector . Le applicazioni possono archiviare, recuperare ed elaborare in modo efficiente incorporamenti numerici a dimensione fissa comunemente usati nei carichi di lavoro di Machine Learning e intelligenza artificiale. Il driver espone il supporto vettoriale tramite API ODBC standard e tipi di dati C. Le applicazioni possono interagire con le colonne vettoriali di SQL Server senza modificare i flussi di lavoro ODBC esistenti.
Si applica a: Microsoft ODBC Driver per SQL Server 18.6.1.1 e versioni successive. Il supporto per il float16 tipo base richiede la versione 18.7.1.1 o successiva.
Il supporto vettoriale è disabilitato di default e deve essere esplicitamente abilitato.
Tipi di elementi base
Una colonna vettoriale dichiara un tipo di elemento base. Il driver supporta entrambi i tipi definiti da SQL Server.
| Tipo base | Indicatore del tipo | Byte per elemento sul filo | Dimensione massima | Versione del driver |
|---|---|---|---|---|
float32 |
SQL_VECTOR_TYPE_FLOAT32 (0) |
4 | 1,998 | 18.6.1.1 |
float16 |
SQL_VECTOR_TYPE_FLOAT16 (1) |
2 | 3,996 | 18.7.1.1 |
float32 è l'impostazione predefinita. Per usare l'archiviazione a mezza precisione, dichiarare la colonna o il parametro come VECTOR(<dimensions>, float16). Poiché un float16 elemento occupa metà dei byte sul filo, un float16 vettore contiene il doppio delle dimensioni all'interno dello stesso limite di payload di 8.000 byte.
Importante
Il buffer applicativo è sempre un array di float (4 byte per elemento) per entrambi i tipi di base. Il driver passa dalla mezza precisione sul filo a una precisione singola nel tuo buffer. Dimensiona ogni buffer con sizeof(float), mai con 2 byte per elemento, nemmeno per una float16 colonna.
Poiché float16 ha meno bit di mantissa rispetto a float32, un giro di andata e ritorno attraverso una float16 colonna è con perdita. I valori vengono arrotondati al valore di mezza precisione rappresentabile più vicino all'inserimento, e il valore letto a ritorno è l'espansione float32 di quel valore arrotondato.
Sul server, float16 è necessario SQL Server 2025 (17.x) con la PREVIEW_FEATURES configurazione con ambito del database abilitata. Per ulteriori informazioni, vedere Supporto a virgola mobile a bassa precisione nel tipo di dati vettore.
Rappresentazione C nativa
Quando il supporto vettoriale è abilitato, le colonne vettoriali vengono scambiate usando una struttura C tipizzata denominata SQL_SS_VECTOR_STRUCT.
typedef enum
{
SQL_VECTOR_TYPE_FLOAT32 = 0, /* 32-bit floating point */
SQL_VECTOR_TYPE_FLOAT16 = 1 /* 16-bit floating point */
} SQLVECTORTYPE;
typedef struct tagSS_VECTOR_STRUCT {
SQLSMALLINT dimension; /* Number of elements */
SQLVECTORTYPE type; /* Element base type indicator */
union data {
float* f32; /* Pointer to float32 data */
float* f16; /* Pointer to float16 data */
} data;
} SQL_SS_VECTOR_STRUCT;
-
dimension: descrive il numero di elementi nel vettore -
type: identifica il tipo di elemento base,SQL_VECTOR_TYPE_FLOAT32oppureSQL_VECTOR_TYPE_FLOAT16 -
data.f32/data.f16: punta al buffer dell'applicazione contenente i valori vettoriali
Entrambi i membri dell'unione sono dichiarati come float* e sono intercambiabili, perché il buffer lato client contiene float32 valori per ciascun tipo base. Usa il membro che documenta la tua intenzione.
Abilitare il supporto vettoriale
La vectorTypeSupport parola chiave stringa di connessione seleziona il livello di supporto vettoriale nativo che la connessione negozia.
| Value | Behavior |
|---|---|
off (impostazione predefinita) |
Le colonne vettoriali appaiono come varchar(max) contenente array JSON. |
v1 |
Supporto vettoriale nativo per il float32 tipo base. |
v2 |
Supporto vettoriale nativo sia per i float32 tipi che float16 per quelli base. Richiede la versione 18.7.1.1 o successiva. |
Puoi anche impostare il livello dopo aver allocato la handle di connessione, e prima di connetterti, con l'attributo SQL_COPT_SS_VECTOR_TYPE_SUPPORT pre-connessione.
Il driver Microsoft espone un binding
SQL_C_SS_VECTORC specifico per driver e supportaSQL_C_BINARYl'output vettoriale. In pratica:Quando abiliti
vectorTypeSupport=v1ov2, le API di recupero (ad esempio,SQLGetDataeSQLBindCol) possono restituire colonne vettoriali come oSQL_C_SS_VECTORSQL_C_BINARY.SQL_C_SS_VECTORrestituisce il vettore in una forma compatta e tipizzata.SQL_C_BINARYrestituisce un payload varbinary.Per il binding di input o parametri, il driver supporta sia
SQL_C_SS_VECTORcheSQL_C_BINARY.SQL_C_SS_VECTORfornisce un'associazione di input tipizzata e compatta.SQL_C_BINARYè equivalente e portabile. UsareSQL_C_SS_VECTORquando si vuole che il driver consideri il payload come un tipo di vettore nativo.Quando
vectorTypeSupport=off, le colonne vettoriali vengono visualizzate come varchar(max) contenenti matrici JSON.
v2 è un superinsieme di v1, quindi una connessione negoziata in v2 gestisce float32 le colonne esattamente come v1 fa. Inviare un float16 valore su una connessione negoziata in v1 fallisce con Requested vector base type is not supported for the negotiated vector version. Usa v2 ogni volta che l'applicazione può incontrare una float16 colonna.
Le applicazioni devono anche impostare la versione ODBC su ODBC 3.8 prima di usare tipi specifici del vettore:
SQLSetEnvAttr(
hEnv,
SQL_ATTR_ODBC_VERSION,
(SQLPOINTER)SQL_OV_ODBC3_80,
0);
Formati di associazione supportati
Associazione vettoriale nativa
Tipo C: SQL_C_SS_VECTOR
Questo formato è consigliato per le applicazioni critiche per le prestazioni.
Collegamento binario
Tipo C: SQL_C_BINARY
I vettori vengono restituiti usando lo stesso layout di SQL_C_SS_VECTOR. Le applicazioni possono usare questo formato per scenari di interoperabilità di basso livello. Il buffer del puntatore dati può essere contiguo o non contiguo con l'indirizzo di memoria della struttura.
Linee guida per l'API ODBC
Questa sezione descrive in che modo le API ODBC interagiscono con i dati vettoriali di SQL Server, inclusi i requisiti di layout del buffer, NULL la gestione e le rappresentazioni di dati supportate. Tutti i comportamenti si applicano quando vectorTypeSupport è impostato su v1 o v2 e l'ambiente è configurato per ODBC 3.8.
Ogni formula della dimensione del buffer in questa sezione usa sizeof(float) per elemento per entrambi i tipi di base, perché il buffer lato client contiene float32 sempre i valori. Una float16 colonna cambia i byte sul filo, non la disposizione del buffer.
SQLBindCol
Usare SQLBindCol per associare colonne vettoriali in un set di risultati ai buffer dell'applicazione.
- Chiamata tipica:
SQLRETURN SQLBindCol(
SQLHSTMT StatementHandle,
SQLUSMALLINT ColumnNumber,
SQLSMALLINT TargetType,
SQLPOINTER TargetValuePtr,
SQLLEN BufferLength,
SQLLEN * StrLen_or_IndPtr);
TargetType: usareSQL_C_SS_VECTORoSQL_C_BINARY.TargetValuePtr: puntatore a unSQL_SS_VECTOR_STRUCTcon una matrice float quandoTargetTypeèSQL_C_SS_VECTOR; in caso contrario, puntatore a un buffer con dimensione pari al valore inStrLen_or_IndPtr.BufferLength:sizeof(SQL_SS_VECTOR_STRUCT)+ il numero di byte allocati per il buffer di colonna (dimensione * 4).StrLen_or_IndPtr: puntatore che riceve la lunghezza in byte del vettore restituito (SQL_DESC_OCTET_LENGTH). Il valore èsizeof(SQL_SS_VECTOR_STRUCT)+ le dimensioni della matrice float (dimensione * 4).
Queste dimensioni sono le stesse per una float16 colonna. Il driver espande ogni elemento di mezza precisione a float a man mano che riempie il buffer, e segnala la lunghezza espansa.
Aspettative del layout del buffer
Buffer non contiguo (scelta consigliata)
- L'applicazione alloca una
SQL_SS_VECTOR_STRUCTper riga. - L'applicazione alloca memoria per
data.f32. - Il driver popola i metadati vettoriali e scrive i valori degli elementi nel buffer float fornito.
SQLLEN numberOfRow = 1000; // set to SQL_ATTR_ROW_ARRAY_SIZE
SQLULEN columnSize = x; // use SQLDescribeCol or SQLColAttributeW or sizeof(SQL_SS_VECTOR_STRUCT) + (dimension * 4)
SQL_SS_VECTOR_STRUCT vecBuffer[numberOfRow]
std::vector<SQLLEN> indicator(numberOfRow, 0);
for (int i = 0; i < numberOfRow; i++)
{
vecBuffer[i].dimension = static_cast<SQLUSMALLINT>((columnSizes[col - 1] - sizeof(SQL_SS_VECTOR_STRUCT)) / 4);
vecBuffer[i].type = SQL_VECTOR_TYPE_FLOAT32; // or SQL_VECTOR_TYPE_FLOAT16
vecBuffer[i].data.f32 = (float*)malloc(vecBuffer[i].dimension * sizeof(float));
if (!vecBuffer[i].data.f32) {
std::cerr << "Memory allocation failed for vector data." << std::endl;
return SQL_ERROR;
}
}
SQLBindCol(hStmt, col, SQL_C_SS_VECTOR, vecBuffer, columnSize, indicators.data());
Buffer contiguo
- L'applicazione alloca un singolo buffer e ODBC lo riempie di conseguenza.
- La matrice float deve iniziare immediatamente dopo lo struct.
- Il driver imposta
data.f32in modo che punti a questa area contigua.
SQLLEN numberOfRow = 1000; // set to SQL_ATTR_ROW_ARRAY_SIZE
SQLULEN columnSize = x; // use SQLDescribeCol or SQLColAttributeW or sizeof(SQL_SS_VECTOR_STRUCT) + (dimension * 4)
std::vector<BYTE> vecBuffer;
std::vector<SQLLEN> indicator(numberOfRow, 0);
vecBuffer.resize(numberOfRow * columnSize);
SQLBindCol(hStmt, col, SQL_C_BINARY, vecBuffer.data(), columnSize, indicators.data());
Gestione NULL per SQLBindCol
Quando il valore della colonna è NULL, il driver imposta *StrLen_or_IndPtr su SQL_NULL_DATA e non popola il buffer. Controllare sempre l'indicatore prima di accedere al contenuto del vettore.
Annotazioni
La lettura e il comportamento di recupero delle righe per le colonne vettoriali sono descritti in dettaglio in SQLFetch e SQLFetchScroll (vedere le informazioni di riferimento sulle API per esempi di recupero semantica e recupero di matrici).
SQLGetData
Usare SQLGetData per recuperare i dati vettoriali da colonne non vincolate.
- Chiamata tipica:
SQLRETURN SQLGetData(
SQLHSTMT StatementHandle,
SQLUSMALLINT Col_or_Param_Num,
SQLSMALLINT TargetType,
SQLPOINTER TargetValuePtr,
SQLLEN BufferLength,
SQLLEN * StrLen_or_IndPtr);
TargetType: usareSQL_C_SS_VECTORoSQL_C_BINARY.TargetValuePtr: puntatore a unSQL_SS_VECTOR_STRUCTcon una matrice float quandoTargetTypeèSQL_C_SS_VECTOR; in caso contrario, puntatore a un buffer con dimensione pari al valore inStrLen_or_IndPtr.BufferLength:sizeof(SQL_SS_VECTOR_STRUCT)+ il numero di byte allocati per il buffer di colonna (dimensione * 4).StrLen_or_IndPtr: puntatore che riceve la lunghezza in byte del vettore restituito (SQL_DESC_OCTET_LENGTH). Il valore èsizeof(SQL_SS_VECTOR_STRUCT)+ le dimensioni della matrice float (dimensione * 4).
L'estrazione in blocchi non è supportata. È necessario recuperare l'intero vettore in una sola chiamata.
Esempio ( vettore nativo):
SQLLEN dataLen = 0;
SQL_SS_VECTOR_STRUCT vec = {};
vec.data.f32 = (float*)malloc(x * sizeof(float)); // x is the dimension
if (!vec.data.f32) {
std::cerr << "Memory allocation failed for vector data." << std::endl;
return SQL_ERROR;
}
SQLGetData(hStmt, col, SQL_C_SS_VECTOR, &vec, sizeof(vec) + sizeof(float) * vec.dimension, &dataLen);
La gestione dei NULL per SQLGetData
Quando il valore della colonna è NULL, il driver imposta *StrLen_or_IndPtr su SQL_NULL_DATA e non popola il buffer. Controllare sempre l'indicatore prima di accedere al contenuto del vettore.
Annotazioni
La lettura e il comportamento di recupero delle righe per le colonne vettoriali sono descritti in dettaglio in SQLFetch e SQLFetchScroll (vedere le informazioni di riferimento sulle API per esempi di recupero semantica e recupero di matrici).
SQLFetch
Usare SQLFetch per recuperare la riga successiva e rappresentare correttamente le colonne legate SqlVector.
- Chiamata tipica:
SQLRETURN SQLFetch(
SQLHSTMT StatementHandle);
Chiamare SQLFetch nel ciclo standard con SqlVector colonne già associate tramite SQLBindCol. In alternativa, usare SQLGetData per recuperare i dati nel buffer dell'applicazione.
Esempio ( vettore nativo):
while ((ret = SQLFetch(hStmt)) == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO) {
// if SQLBindCol was used directly jump to read buffer
// else use SQLGetData and than read buffer.
std::cout << " data: [";
if (dataLen != SQL_NULL_DATA)
{
for (SQLUSMALLINT d = 0; d < vec.dimension; ++d) {
std::cout << vec.data.f32[d];
if (d + 1 < vec.dimension) std::cout << ", ";
}
}
std::cout << "]" << std::endl;
}
SQLFetchScroll
Utilizzare SQLFetchScroll per recuperare set di righe in base a un orientamento specificato (successivo, precedente, assoluto, relativo, segnalibro). Il driver copia correttamente i dati vettoriali nei buffer dell'applicazione.
- Chiamata tipica:
SQLRETURN SQLFetchScroll(
SQLHSTMT StatementHandle,
SQLSMALLINT FetchOrientation,
SQLLEN FetchOffset);
Esempio ( vettore nativo):
// Fetch rows in batches
while ((ret = SQLFetchScroll(hStmt, SQL_FETCH_NEXT, 0)) != SQL_NO_DATA) {
for (SQLULEN i = 0; i < numRowsFetched; i++) {
// In case of Contiguous Buffer
SQL_SS_VECTOR_STRUCT* vecptr = reinterpret_cast<SQL_SS_VECTOR_STRUCT*>(
vecBuffer.data() + (i * columnSizes[col - 1]));
float* floats = reinterpret_cast<float*>(
reinterpret_cast<char*>(vecptr) + sizeof(SQL_SS_VECTOR_STRUCT)
);
// in Case of non-contiguous Buffer
SQL_SS_VECTOR_STRUCT* vecptr = &vecBuffer[i];
float* floats = vecptr->data.f32;
if (indicators[i] != SQL_NULL_DATA)
{
for (SQLUSMALLINT d = 0; d < vecptr->dimension; ++d) {
std::cout << floats[d];
if (d + 1 < vecptr->dimension) std::cout << ", ";
}
}
std::cout << "]" << std::endl;
}
}
SQLBindParameter
Usare SQLBindParameter per inviare valori vettoriali a SQL Server.
- Chiamata tipica:
SQLRETURN SQLBindParameter(
SQLHSTMT StatementHandle,
SQLUSMALLINT ParameterNumber,
SQLSMALLINT InputOutputType,
SQLSMALLINT ValueType,
SQLSMALLINT ParameterType,
SQLULEN ColumnSize,
SQLSMALLINT DecimalDigits,
SQLPOINTER ParameterValuePtr,
SQLLEN BufferLength,
SQLLEN * StrLen_or_IndPtr);
-
ParameterValuePtr: punta a unSQL_SS_VECTOR_STRUCTpopolato -
ColumnSize: ignorato nei parametri di input. Per i parametri di output e gli scenari di data-at-execution, specificare le dimensioni totali del vettore:sizeof(SQL_SS_VECTOR_STRUCT)+ (dimensioni della matrice float ) -
DecimalDigits: ignorato nei parametri di input. Per i parametri di output e gli scenari di data-at-execution, specificare il tipo di base vettoriale -
BufferLength: ≥sizeof(SQL_SS_VECTOR_STRUCT)+ (dimensione *sizeof(float)) -
*StrLen_or_IndPtr: deve contenere la stessa dimensione totale
Da dove proviene il tipo base
Il driver legge il tipo di elemento base da un punto diverso a seconda della direzione del parametro. Sbagliare questo è la causa più comune di Invalid vector dimension errori Provided buffer length too small/large su un float16 parametro.
| Tipo di parametro | Sorgente di tipo base | Sorgente dimensionale |
|---|---|---|
| Ingresso e input/output | Il type campo del SQL_SS_VECTOR_STRUCT tu superi |
Il dimension campo della stessa struttura |
| Uscita pura | DecimalDigits |
Derivato da ColumnSize come (ColumnSize - sizeof(SQL_SS_VECTOR_STRUCT)) / sizeof(float) |
| Dati all'esecuzione | DecimalDigits |
Derivato da ColumnSize, e incrociato con la lunghezza passata a . SQL_LEN_DATA_AT_EXEC |
Per un parametro di input, BufferLength deve essere uguale sizeof(SQL_SS_VECTOR_STRUCT) esattamente a + (dimensione * sizeof(float)). Un valore maggiore o più piccolo fallisce invece di essere tollerato.
Esempio ( vettore nativo, float32):
float values[3] = {1.0f, 2.0f, 3.0f};
SQL_SS_VECTOR_STRUCT vec;
SQLLEN cb;
vec.dimension = 3;
vec.type = SQL_VECTOR_TYPE_FLOAT32;
vec.data.f32 = values;
cb = sizeof(vec) + sizeof(values);
SQLBindParameter(
hStmt, 1, SQL_PARAM_INPUT, SQL_C_SS_VECTOR, SQL_SS_VECTOR, 0, 0, &vec, cb, &cb);
Esempio ( vettore nativo, float16):
Solo il type campo cambia. L'array di valori rimane un float array ed cb è calcolato allo stesso modo.
float values[3] = {1.0f, 2.0f, 3.0f};
SQL_SS_VECTOR_STRUCT vec;
SQLLEN cb;
vec.dimension = 3;
vec.type = SQL_VECTOR_TYPE_FLOAT16;
vec.data.f16 = values; /* still a float32 array */
cb = sizeof(vec) + sizeof(values);
SQLBindParameter(
hStmt, 1, SQL_PARAM_INPUT, SQL_C_SS_VECTOR, SQL_SS_VECTOR, 0, 0, &vec, cb, &cb);
Esempio (float16 parametro di uscita):
Un parametro di output puro non porta struttura in ingresso, quindi il tipo base viene passato in DecimalDigits e la dimensione deriva da ColumnSize.
SQL_SS_VECTOR_STRUCT vec = {};
float values[3] = {};
vec.data.f16 = values;
SQLULEN columnSize = sizeof(SQL_SS_VECTOR_STRUCT) + 3 * sizeof(float);
SQLLEN cb = (SQLLEN)columnSize;
SQLBindParameter(
hStmt, 1, SQL_PARAM_OUTPUT, SQL_C_SS_VECTOR, SQL_SS_VECTOR,
columnSize, SQL_VECTOR_TYPE_FLOAT16, &vec, cb, &cb);
Gestione NULL per SQLBindParameter
Le applicazioni possono indicare un vettore usando uno NULL dei due approcci supportati:
Impostare
*StrLen_or_IndPtraSQL_NULL_DATAe passareNULLcomeParameterValuePtrSpecificare un oggetto
SQL_SS_VECTOR_STRUCTcon:Tipo di set di dimensione impostato al tipo base della colonna
data.f32=NULL
SQLPutData
Il driver supporta SQLPutData per i parametri vettoriali con questi vincoli:
È necessario specificare l'intero vettore nella prima chiamata.
Il driver non supporta la trasmissione di vettori in blocchi o incrementali.
NULLla gestione segue le stesse regole diSQLBindParameter.Chiamata tipica:
SQLRETURN SQLPutData(
SQLHSTMT StatementHandle,
SQLPOINTER DataPtr,
SQLLEN StrLen_or_Ind);
-
DataPtr: punta a unSQL_SS_VECTOR_STRUCTpopolato -
StrLen_or_Ind:sizeof(SQL_SS_VECTOR_STRUCT)+ (dimensione *sizeof(float))
Esempio ( vettore nativo):
std::vector<float> floatArray = { 1.0f, 2.0f, 3.0f };
SQL_SS_VECTOR_STRUCT vectorValue = {0};
vectorValue.type = SQL_VECTOR_TYPE_FLOAT32; // or SQL_VECTOR_TYPE_FLOAT16
vectorValue.dimension = (SQLUSMALLINT)floatArray.size();
vectorValue.data.f32 = floatArray.data();
// Tell ODBC this parameter will be supplied at execution time
SQLLEN cbVectorLen = SQL_LEN_DATA_AT_EXEC(
(SQLLEN)(sizeof(SQL_SS_VECTOR_STRUCT) + floatArray.size() * sizeof(float))
);
// Optional token to identify which parameter needs data
SQLPOINTER token = (SQLPOINTER)1;
// Bind as DATA_AT_EXEC: BufferLength is 0, value pointer can be a token
SQLRETURN rc = SQLBindParameter(hStmt, 1, SQL_PARAM_INPUT, SQL_C_SS_VECTOR, SQL_SS_VECTOR, 0, 0, token, 0, &cbVectorLen);
if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {
// handle error
}
rc = SQLExecute(hStmt);
if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO && rc != SQL_NEED_DATA) {
// handle error
}
SQLPOINTER pParamToken = NULL;
rc = SQLParamData(hStmt, &pParamToken);
if (rc == SQL_NEED_DATA) {
// Provide entire vector in first SQLPutData call (no chunking)
rc = SQLPutData(
hStmt,
(SQLPOINTER)&vectorValue,
(SQLLEN)(sizeof(SQL_SS_VECTOR_STRUCT) + floatArray.size() * sizeof(float))
);
if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) {
// handle error
}
// Finalize parameter transfer
rc = SQLParamData(hStmt, &pParamToken);
}
Metadati del descrittore
Quando si abilita il supporto vettoriale, Microsoft ODBC Driver per SQL Server espone i metadati vettoriali tramite API del descrittore ODBC standard. Le applicazioni possono usare informazioni sul descrittore per individuare i dettagli dello schema vettoriale, le dimensioni del buffer di calcolo e configurare correttamente le associazioni per parametri e set di risultati.
Valori dei campi del descrittore per vector
La tabella seguente riepiloga i valori dei campi del descrittore per le colonne vettoriali e i parametri di SQL Server.
| Campo descrittore | Value | Description |
|---|---|---|
SQL_DESC_TYPE |
SQL_SS_VECTOR (-156) |
Identificatore del tipo di dati SQL di base |
SQL_DESC_CONCISE_TYPE |
SQL_SS_VECTOR |
Tipo di dati SQL conciso |
SQL_DESC_TYPE_NAME |
vector |
Nome del tipo SQL |
SQL_DESC_LOCAL_TYPE_NAME |
vector |
Nome del tipo locale del driver |
SQL_DESC_LENGTH |
sizeof(SQL_SS_VECTOR_STRUCT) + (dimension * sizeof(float)) |
Dimensioni logiche del valore del vettore |
SQL_DESC_OCTET_LENGTH |
Uguale a SQL_DESC_LENGTH |
Dimensioni fisiche in byte |
SQL_DESC_PRECISION |
Uguale a SQL_DESC_LENGTH |
Usato per segnalare le dimensioni del vettore |
SQL_DESC_SCALE |
SQL_VECTOR_TYPE_FLOAT32 oppure SQL_VECTOR_TYPE_FLOAT16 |
Tipo di elemento base vettoriale |
SQL_CA_SS_VECTOR_DIMENSION |
dimension |
Numero di elementi nel vettore |
SQL_DESC_DISPLAY_SIZE |
dimension * VECTOR_FLOAT32_TO_CHAR_JSON_MAX_SIZE |
Lunghezza massima della visualizzazione JSON |
SQL_DESC_FIXED_PREC_SCALE |
SQL_FALSE |
Il vettore non ha precisione/scala fissa |
SQL_DESC_NULLABLE |
SQL_NULLABLE |
Le colonne vettoriali consentono di NULL valori |
SQL_DESC_NUM_PREC_RADIX |
0 |
Tipo non numerico |
SQL_DESC_SEARCHABLE |
SQL_PRED_NONE |
Non utilizzabile nei predicati |
SQL_DESC_UNSIGNED |
SQL_TRUE |
Il tipo di elemento è senza segno |
SQL_DESC_AUTO_UNIQUE_VALUE |
SQL_FALSE |
Non automaticamente unico |
SQL_DESC_CASE_SENSITIVE |
SQL_FALSE |
Senza distinzione tra maiuscole e minuscole |
SQL_DESC_UPDATABLE |
SQL_ATTR_READWRITE_UNKNOWN |
Aggiornabilità sconosciuta |
SQL_DESC_LENGTH, SQL_DESC_OCTET_LENGTH, e SQL_DESC_PRECISION tutti descrivono il buffer lato client, quindi riportano sizeof(SQL_SS_VECTOR_STRUCT) + (dimensione * sizeof(float)) per una float16 colonna oltre che per uno float32 . I due differiscono solo per il numero di byte che SQL Server memorizza e trasmette.
SQL_DESC_SCALE è l'unico campo descrittivo che distingue i tipi base. Leggerlo è il modo in cui un'applicazione scopre se una colonna è float32 o float16.
SQLColAttribute per dimensione vettoriale
A partire dalla versione 18.7.1.1, SQL_CA_SS_VECTOR_DIMENSION restituisce direttamente il conteggio degli elementi di una colonna vettoriale, così un'applicazione non deve più derivarlo da un campo di lunghezza:
SQLLEN dimension = 0;
SQLColAttribute(hStmt, col, SQL_CA_SS_VECTOR_DIMENSION, NULL, 0, NULL, &dimension);
SQLLEN baseType = 0;
SQLColAttribute(hStmt, col, SQL_DESC_SCALE, NULL, 0, NULL, &baseType);
/* baseType is SQL_VECTOR_TYPE_FLOAT32 or SQL_VECTOR_TYPE_FLOAT16 */
Puoi anche impostare SQL_CA_SS_VECTOR_DIMENSION un descrittore applicativo o un parametro vettoriale sull'IPD. Impostandolo su qualsiasi altro tipo di parametro restituisce un errore di campo descrittore non valido.
SQLDescribeCol
Quando si chiama SQLDescribeCol per una colonna vettoriale :
-
DataTypeèSQL_SS_VECTOR -
ColumnSizecorrisponde aSQL_DESC_PRECISION -
DecimalDigitsè l'indicatore del tipo di elemento base, non una scala numerica:0perfloat32e1perfloat16 -
NullableèSQL_NULLABLE
Le dimensioni della colonna segnalata rappresentano le dimensioni del payload del vettore nativo: sizeof(SQL_SS_VECTOR_STRUCT) + (dimensione * sizeof(float))
SQLDescribeParam
Quando si usa SQLDescribeParam per un parametro vector :
-
DataTypeèSQL_SS_VECTOR -
ColumnSizeè uguale alla dimensione del payload del vettore nativo -
DecimalDigitsè l'indicatore del tipo di elemento base, non una scala numerica:0perfloat32e1perfloat16 -
NullableèSQL_NULLABLE
Queste informazioni consentono alle applicazioni di allocare correttamente i buffer dei parametri prima dell'associazione.
SQLColAttribute
Usare
SQLColAttribute(hstmt, ColumnNumber, SQL_DESC_OCTET_LENGTH, ...)per ottenere la lunghezza esatta dei byte del payload del vettore.SQL_DESC_LENGTHeSQL_DESC_PRECISIONpossono contenere valori specifici del driver. Per il conteggio dei byte, preferireSQL_DESC_OCTET_LENGTH.-
NULLhandling: quando una colonna èNULL,SQLColAttribute(o l'oggettoStrLen_or_IndPtrusato conSQLBindCol) restituisceSQL_NULL_DATA. Verificare la presenza diSQL_NULL_DATAprima di usare le lunghezze o i buffer restituiti.
-
Copia massiva (BCP)
È possibile importare ed esportare in blocco le colonne vettoriali tramite file BCP e l'API bcp_bind , proprio come altri tipi di dati. Attualmente, l'importazione e l'esportazione di vettori supporta solo il formato nativo (SQLVECTOR) o varbinary (SQLBINARY), ma non il formato carattere. La conversione tra il tipo di vettore e il tipo di carattere non è supportata.
La copia in blocco rispetta lo stesso livello di supporto del resto del pilota. Una float16 colonna richiede una connessione negoziata in vectorTypeSupport=v2. Nell'utilità bcp , usa -z0 per float32 e -z1 per float16. Per altre informazioni, vedere utilità bcp.
Per altre informazioni sul token di tipo, sulla lunghezza predefinita del prefisso e sulla lunghezza predefinita del campo per vector, vedere Tipo di archiviazione file, Lunghezza prefisso e Lunghezza campo.
bcp_gettypename
Quando si usa bcp_gettypename per ottenere il nome del tipo SQL del vettore, restituisce il token di tipo BCP (SQLVECTOR) e "vector".
bcp_bind
Usare bcp_bind per inserire in blocco le variabili di programma in una colonna vettoriale .
Chiamata tipica:
RETCODE bcp_bind (
HDBC hdbc,
LPCBYTE pData,
INT cbIndicator,
DBINT cbData,
LPCBYTE pTerm,
INT cbTerm,
INT eDataType,
INT idxServerCol);
-
pData: secbIndicatorè zero, contiene un puntatore aiSQL_SS_VECTOR_STRUCTdati, con dati di matrice float al suo interno (vectorStruct.data.f32campo). SecbIndicatorè diverso da zero, l'indicatore viene visualizzato in memoria direttamente prima dei dati. QuindipDataè un puntatore a un buffer che inizia concbIndicatorbyte di indicatore di lunghezza, seguito da una struct vettoriale. -
cbData: se specificato, deve avere un valore esattamente uguale a -sizeof(SQL_SS_VECTOR_STRUCT)+ ( *sizeof(float)dimensione). In caso contrario, si verifica un errore. Questo vale per entrambi i tipi di base, perché il buffer vincente mantienefloat32valori in entrambi i sensi. -
eDataType:SQLVECTORoSQLBINARY
Imposta il type campo della struttura al tipo base della colonna. Per una float16 colonna, il driver converte l'array limitato float32 a metà precisione mentre costruisce il payload del filo, quindi un file dati scritto in formato nativo contiene due byte per elemento.
Quando si importano dati in una colonna vettoriale tramite bcp_bind, impostare eDataType su SQLVECTOR o SQLBINARY. In entrambi i casi, è necessario fornire dati sotto forma di SQL_SS_VECTOR_STRUCT.
Risoluzione dei problemi e suggerimenti
- Se
SQLGetTypeInfonon elencaVECTOR, utilizzare il fallback per archiviare i vettori come varchar. -
Requested vector base type is not supported for the negotiated vector version.significa che unfloat16valore è stato usato su una connessione negoziata invectorTypeSupport=v1. Riconnettiti conv2. -
Provided buffer length too small/large.significaBufferLengthche non corrispondevasizeof(SQL_SS_VECTOR_STRUCT)esattamente a + (dimensione *sizeof(float)). Controlla che il buffer sia dimensionato consizeof(float)invece che con due byte per elemento, anche per unafloat16colonna. -
Invalid vector dimensionsignifica che la dimensione è zero, o supera il massimo per il tipo base: 1.998 perfloat32e 3.996 perfloat16. -
Invalid vector base typesignifica che iltypecampo aveva un valore diverso daSQL_VECTOR_TYPE_FLOAT32oSQL_VECTOR_TYPE_FLOAT16. Una struttura inizializzata a zero ha di default .float32 - Se una
float16colonna viene segnalata come varchar(max) contenente un array JSON, il server non ha abilitata laPREVIEW_FEATURESconfigurazione con scope del database, o la connessione negoziata a un livello inferiore av2.