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.
Si applica a: Sql Server 2025 (17.x)
Database
SQL di Azure Istanza
gestita di SQL di Azurein Microsoft Fabric
Il tipo di dati vector è progettato per archiviare i dati vettoriali ottimizzati per operazioni come la ricerca di somiglianza e le applicazioni di Machine Learning. I vettori vengono archiviati in un formato binario ottimizzato, ma vengono esposti come matrici JSON per praticità. Ogni elemento del vettore viene archiviato come valore a virgola mobile a precisione singola (4 byte).
Per offrire agli sviluppatori un'esperienza familiare, il tipo di dati vector viene creato e visualizzato come matrice JSON. Ad esempio, un vettore con tre dimensioni può essere rappresentato come '[0.1, 2, 30]'. È possibile eseguire la conversione implicita ed esplicita da e al tipo vector usando tipi varchar, nvarchar e json .
Note
SQL Server 2025 (17.x) supporta vettori a metà precisione (float16). Per ulteriori informazioni, vedere Supporto a virgola mobile a bassa precisione nel tipo di dati vettore.
float16 vector è attualmente disponibile per l'anteprima. Per testare, abilitare l'opzione PREVIEW_FEATURES di configurazione con ambito database. Per informazioni dettagliate, vedere PREVIEW_FEATURES = { ON | OFF }.
ALTER DATABASE SCOPED CONFIGURATION
SET PREVIEW_FEATURES = ON;
GO
Per le limitazioni, vedere Limitazioni e Problemi noti.
Note
Le funzionalità vettoriali sono disponibili in Istanza gestita di SQL di Azure configurata con il criterio [Always-up-to-date](/azure/azure-sql/managed-instance/ update-policy#always-up-to-date-update-policy).
Per altre informazioni sull'uso dei dati vettoriali, vedere:
Sintassi di esempio
La sintassi di utilizzo per il tipo vector è simile a tutti gli altri tipi di dati di SQL Server in una tabella.
column_name VECTOR ( { <dimensions> } ) [ NOT NULL | NULL ]
Per impostazione predefinita, il tipo di base è float32. Per usare la mezza precisione, è necessario specificare float16 in modo esplicito.
column_name VECTOR ( <dimensions> [ , <base_type> ] ) [ NOT NULL | NULL ]
Dimensions
Un vettore deve avere almeno una dimensione. Il numero massimo di dimensioni supportate è 1998.
Examples
A. Definizione di colonna
Il tipo di vettore può essere usato nella definizione di colonna contenuta in un'istruzione CREATE TABLE , ad esempio:
Nell'esempio seguente viene creata una tabella con una colonna vettoriale e vengono inseriti dati.
È possibile definire una colonna vettoriale in una tabella usando il tipo di base predefinito (float32) o specificare float16 in modo esplicito per l'archiviazione a metà precisione.
CREATE TABLE dbo.vectors
(
id INT PRIMARY KEY,
v VECTOR(3) NOT NULL -- Uses default base type (`float32`)
);
CREATE TABLE dbo.vectors
(
id INT PRIMARY KEY,
v VECTOR(3, float16) -- Uses float16 for reduced storage and precision
);
INSERT INTO dbo.vectors (id, v)
VALUES (1, '[0.1, 2, 30]'),
(2, '[-100.2, 0.123, 9.876]'),
(3, JSON_ARRAY(1.0, 2.0, 3.0)); -- Using JSON_ARRAY to create a vector
SELECT *
FROM dbo.vectors;
B. Utilizzo nelle variabili
Nell'esempio seguente vengono dichiarati vettori usando il nuovo tipo di dati vector e vengono calcolate le distanze usando la VECTOR_DISTANCE funzione .
Il tipo di vettore può essere usato con le variabili:
DECLARE @v AS VECTOR(3) = '[0.1, 2, 30]';
SELECT @v;
DECLARE @v AS VECTOR(3, float16) = '[0.1, 2, 30]';
SELECT @v;
C. Utilizzo in stored procedure o funzioni
Il tipo di dati vector può essere usato come parametro in stored procedure o funzioni. Per esempio:
CREATE PROCEDURE dbo.SampleStoredProcedure
@V VECTOR(3),
@V2 VECTOR(3) OUTPUT
AS
BEGIN
SELECT @V;
SET @V2 = @V;
END
Disponibilità delle funzionalità
Il nuovo tipo di vettore è disponibile in tutti i livelli di compatibilità del database.
Il supporto per i vettori float16 è attualmente condizionato dalla configurazione PREVIEW_FEATURES.
È necessario abilitarlo in modo esplicito prima di usare VECTOR(..., float16).
ALTER DATABASE SCOPED CONFIGURATION
SET PREVIEW_FEATURES = ON;
GO
Conversions
- Il tipo di vettore non può essere usato con il tipo sql_variant o assegnato a una variabile o a una colonna sql_variant . Questa restrizione è simile ai tipi di dati varchar(max), varbinary(max), nvarchar(max), xml, json e CLR.
Compatibility
Miglioramenti al protocollo TDS
SQL Server archivia i vettori in un formato binario ottimizzato, ma li espone come matrici JSON per praticità.
I driver supportati usano miglioramenti al protocollo TDS per trasmettere i dati vettoriali in modo più efficiente in formato binario e presentarli alle applicazioni come tipi vettoriali nativi. Questo approccio riduce le dimensioni del payload, elimina il sovraccarico dell'analisi JSON e mantiene la precisione a virgola mobile completa. Di conseguenza, migliora sia le prestazioni che l'accuratezza quando si lavora con vettori altamente dimensionali in scenari di intelligenza artificiale e machine learning.
Note
float16 i vettori sono attualmente trasmessi come varchar(max) (matrice JSON) su TDS. Il supporto del trasporto binario per float16 non è ancora disponibile nei driver come ODBC, JDBC e .NET.
Supporto del driver nativo
Le applicazioni che usano TDS versione 7.4 o successiva e i driver aggiornati possono leggere, scrivere, trasmettere e copiare in modo nativo i dati vettoriali in massa.
Queste funzionalità richiedono versioni dei driver seguenti. Assicurarsi di usare la versione corretta per abilitare il supporto del vettore nativo.
-
Microsoft.Data.SqlClient: la versione 6.1.0 introduce il
SqlVectortipo, estendendoSystem.Data.SqlDbTypes. -
Microsoft JDBC Driver per SQL Server: la versione 13.1.0 Preview introduce il
microsoft.sql.Types.VECTORtipo emicrosoft.sql.Vectorclasse.
Note
Per i client che non supportano il protocollo TDS aggiornato, SQL Server continua a esporre i dati vettoriali come tipi varchar(max) per garantire la compatibilità con le versioni precedenti. Le applicazioni client possono usare i dati vettoriali come se fossero una matrice JSON. Il motore di database SQL converte automaticamente i vettori in e da una matrice JSON, rendendo trasparente il nuovo tipo per il client. Di conseguenza, i driver e tutte le lingue sono automaticamente compatibili con il nuovo tipo.
È possibile iniziare subito a usare il nuovo tipo di vettore . Gli esempi seguenti illustrano lingue e configurazioni del driver diverse.
Important
Richiede Microsoft.Data.SqlClient 6.1.0 o versione successiva per il supporto di vettori nativi.
using Microsoft.Data;
using Microsoft.Data.SqlClient;
using Microsoft.Data.SqlTypes;
namespace VectorSampleApp
{
class Program
{
// Set your environment variable or fallback to local server
private static readonly string connectionString =
Environment.GetEnvironmentVariable("CONNECTION_STR")
?? "Server=tcp:localhost,1433;Database=Demo2;Integrated Security=True;TrustServerCertificate=True";
private const int VectorDimensions = 3;
private const string TableName = "dbo.Vectors";
static void Main()
{
using var connection = new SqlConnection(connectionString);
connection.Open();
SetupTables(connection, TableName, VectorDimensions);
InsertVectorData(connection, TableName);
ReadVectorData(connection, TableName);
}
private static void SetupTables(SqlConnection connection, string tableName, int vectorDimensionCount)
{
using var command = connection.CreateCommand();
command.CommandText = $@"
IF OBJECT_ID('{tableName}', 'U') IS NOT NULL DROP TABLE {tableName};
IF OBJECT_ID('{tableName}Copy', 'U') IS NOT NULL DROP TABLE {tableName}Copy;";
command.ExecuteNonQuery();
command.CommandText = $@"
CREATE TABLE {tableName} (
Id INT IDENTITY(1,1) PRIMARY KEY,
VectorData VECTOR({vectorDimensionCount})
);
CREATE TABLE {tableName}Copy (
Id INT IDENTITY(1,1) PRIMARY KEY,
VectorData VECTOR({vectorDimensionCount})
);";
command.ExecuteNonQuery();
}
private static void InsertVectorData(SqlConnection connection, string tableName)
{
using var command = new SqlCommand($"INSERT INTO {tableName} (VectorData) VALUES (@VectorData)", connection);
var param = command.Parameters.Add("@VectorData", SqlDbTypeExtensions.Vector);
// Insert null using DBNull.Value
param.Value = DBNull.Value;
command.ExecuteNonQuery();
// Insert non-null vector
param.Value = new SqlVector<float>(new float[] { 3.14159f, 1.61803f, 1.41421f });
command.ExecuteNonQuery();
// Insert typed null vector
param.Value = SqlVector<float>.CreateNull(VectorDimensions);
command.ExecuteNonQuery();
// Prepare once and reuse for loop
command.Prepare();
for (int i = 0; i < 10; i++)
{
param.Value = new SqlVector<float>(new float[]
{
i + 0.1f,
i + 0.2f,
i + 0.3f
});
command.ExecuteNonQuery();
}
}
private static void ReadVectorData(SqlConnection connection, string tableName)
{
using var command = new SqlCommand($"SELECT VectorData FROM {tableName}", connection);
using var reader = command.ExecuteReader();
while (reader.Read())
{
var sqlVector = reader.GetSqlVector<float>(0);
Console.WriteLine($"Type: {sqlVector.GetType()}, IsNull: {sqlVector.IsNull}, Length: {sqlVector.Length}");
if (!sqlVector.IsNull)
{
float[] values = sqlVector.Memory.ToArray();
Console.WriteLine("VectorData: " + string.Join(", ", values));
}
else
{
Console.WriteLine("VectorData: NULL");
}
}
}
}
}
Note
Se non si usano i driver .NET più recenti, è comunque possibile usare i dati vettoriali in C# serializzandoli e deserializzandoli come stringa JSON usando la JsonSerializer classe . Ciò garantisce la compatibilità con la varchar(max) rappresentazione dei vettori esposti da SQL Server per i client meno recenti.
using Microsoft.Data.SqlClient;
using Dapper;
using DotNetEnv;
using System.Text.Json;
namespace DotNetSqlClient;
class Program
{
static void Main(string[] args)
{
Env.Load();
var v1 = new float[] { 1.0f, 2.0f, 3.0f };
using var conn = new SqlConnection(Env.GetString("MSSQL"));
conn.Execute("INSERT INTO dbo.vectors VALUES(100, @v)", param: new {@v = JsonSerializer.Serialize(v1)});
var r = conn.ExecuteScalar<string>("SELECT v FROM dbo.vectors") ?? "[]";
var v2 = JsonSerializer.Deserialize<float[]>(r);
Console.WriteLine(JsonSerializer.Serialize(v2));
}
}
Tools
Gli strumenti seguenti supportano il tipo di dati vector :
- SQL Server Management Studio versione 21 e versioni successive
- DacFX e SqlPackage versione 162.5 (novembre 2024) e versioni successive
- Estensione SQL Server per Visual Studio Code versione 1.32 (maggio 2025) e versioni successive
- Microsoft.Build.Sql versione 1.0.0 (marzo 2025) e versioni successive
- SQL Server Data Tools (Visual Studio 2022) versione 17.13 e versioni successive
Limitations
Il tipo di vettore presenta le limitazioni seguenti:
Tables
I vincoli a livello di colonna non sono supportati, ad eccezione dei
NULL/NOT NULLvincoli.DEFAULTe i vincoliCHECKnon sono supportati per le colonne vettoriali.I vincoli di chiave, ad esempio
PRIMARY KEYoFOREIGN KEY, non sono supportati per le colonne vettoriali . L'uguaglianza, l'univocità, i join che usano colonne vettoriali come chiavi e gli ordini di ordinamento non si applicano ai tipi di dati vettoriali .Non esiste alcuna nozione di univocità per i vettori, quindi i vincoli univoci non sono applicabili.
Anche il controllo dell'intervallo di valori all'interno di un vettore non è applicabile.
I vettori non supportano il confronto, l'addizione, la sottrazione, la moltiplicazione, la divisione, la concatenazione o qualsiasi altro operatore di assegnazione matematica, logica e composta.
le colonne vettoriali non possono essere usate nelle tabelle ottimizzate per la memoria.
Indexes
- Gli indici dell'albero B o gli indici columnstore non sono consentiti nelle colonne vettoriali . Tuttavia, una colonna vettoriale può essere specificata come colonna inclusa in una definizione di indice.
Metadati dello schema di tabella
- sp_describe_first_result_set stored procedure di sistema non restituisce correttamente il tipo di dati vector. Di conseguenza, molti client e driver di accesso ai dati vedono un tipo di dati varchar o nvarchar .
Tabelle del libro mastro
- La procedura
sp_verify_database_ledgergenera un errore se il database contiene una tabella con una colonna vettoriale.
Tipi definiti dall'utente
- La creazione del tipo alias che usa
CREATE TYPEper il tipo vector non è consentita, analogamente al comportamento dei tipi di dati xml e json .
Sempre Crittografato
- il tipo vector non è supportato con la funzionalità Always Encrypted.
Problemi noti
- Il mascheramento dei dati attualmente mostra i dati vettoriali come tipo di dati varbinary nel portale di Azure.