Notes
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
S’applique à : SQL Server 2025 (17.x) Préversion de
la base de données SQL Azure SQL Database
Azure SQL Managed Instance
SQL dans Microsoft Fabric
Le type de données vecteur est conçu pour stocker les données vectorielles optimisées pour les opérations telles que la recherche de similarité et les applications Machine Learning. Les vecteurs sont stockés dans un format binaire optimisé, mais sont exposés sous forme de tableaux JSON pour des raisons pratiques. Chaque élément du vecteur est stocké sous forme de valeur à virgule flottante (4 octets) simple précision.
Pour offrir une expérience familière aux développeurs, le type de données vectorielles est créé et affiché sous la forme d’un tableau JSON. Par exemple, un vecteur avec trois dimensions peut être représenté en tant que '[0.1, 2, 30]'
. La conversion implicite et explicite depuis et vers le type de vecteur peut être effectuée à l’aide de types varchar, nvarchar et json .
Remarque
Pour connaître les limitations, passez en revue les limitations et les problèmes connus.
Les fonctionnalités vectorielles sont disponibles dans Azure SQL Managed Instance configurée avec la stratégie Always-up-to-date .
Pour plus d’informations sur l’utilisation des données Vecteur, consultez :
Exemple de syntaxe
La syntaxe d’utilisation du type vecteur est similaire à tous les autres types de données SQL Server dans une table.
column_name VECTOR( {<dimensions>} ) [NOT NULL | NULL]
Taille
Un vecteur doit avoir au moins une dimension. Le nombre maximal de dimensions prises en charge est 1998.
Exemples
R. Définition de colonne
Le type de vecteur peut être utilisé dans la définition de colonne contenue dans une instruction CREATE TABLE
, par exemple :
L’exemple suivant crée une table avec une colonne vectorielle et insère des données dans celle-ci.
CREATE TABLE dbo.vectors
(
id INT PRIMARY KEY,
v VECTOR(3) NOT NULL
);
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. Utilisation dans les variables
L’exemple suivant déclare des vecteurs à l’aide du nouveau type de données vecteur et calcule les distances à l’aide de la fonction VECTOR_DISTANCE
.
Le type de vecteur peut être utilisé avec des variables :
DECLARE @v VECTOR(3) = '[0.1, 2, 30]';
SELECT @v;
Chapitre C. Utilisation dans les procédures stockées ou les fonctions
Le type de données vecteur peut être utilisé comme paramètre dans la procédure stockée ou les fonctions. Par exemple :
CREATE PROCEDURE dbo.SampleStoredProcedure
@V VECTOR(3),
@V2 VECTOR(3) OUTPUT
AS
BEGIN
SELECT @V;
SET @V2 = @V;
END
Disponibilité des fonctionnalités
Le nouveau type vecteur est disponible sous tous les niveaux de compatibilité de base de données.
Transformations
- Le type vecteur ne peut pas être utilisé avec le type sql_variant ou affecté à une variable ou une colonne sql_variant. Cette restriction est similaire à varchar(max),varbinary(max), nvarchar(max), xml, json et aux types de données basés sur CLR.
Compatibilité
Améliorations apportées au protocole TDS
SQL Server stocke les vecteurs dans un format binaire optimisé, mais les expose sous forme de tableaux JSON pour des raisons pratiques. Les pilotes pris en charge utilisent des améliorations apportées au protocole TDS pour transmettre des données vectorielles plus efficacement au format binaire et les présenter aux applications en tant que types vectoriels natifs. Cette approche réduit la taille de la charge utile, élimine la surcharge de l’analyse JSON et conserve la précision à virgule flottante complète. Par conséquent, il améliore les performances et la précision lors de l’utilisation de vecteurs haute dimensionnels dans les scénarios IA et Machine Learning.
Prise en charge native des pilotes.
Les applications utilisant TDS version 7.4 ou ultérieure et les pilotes mis à jour peuvent lire, écrire, diffuser et copier en bloc des données vectorielles en mode natif.
Ces fonctionnalités nécessitent des versions des pilotes répertoriés ci-dessous. Vérifiez que vous utilisez la version correcte pour activer la prise en charge des vecteurs natifs.
-
Microsoft.Data.SqlClient : la version 6.1.0 introduit le
SqlVector
type, extensionSystem.Data.SqlDbTypes
. -
Microsoft JDBC Driver pour SQL Server : la version 13.1.0 Preview introduit le
microsoft.sql.Types.VECTOR
type et lamicrosoft.sql.Vector
classe.
Remarque
Pour les clients qui ne prennent pas en charge le protocole TDS mis à jour, SQL Server continue d’exposer des données vectorielles en tant que types varchar(max) pour garantir la compatibilité descendante. Les applications clientes peuvent utiliser des données vectorielles comme s’il s’agissait d’un tableau JSON. Le moteur de base de données SQL convertit automatiquement les vecteurs vers et à partir d’un tableau JSON, ce qui rend le nouveau type transparent pour le client. Par conséquent, les pilotes et toutes les langues sont automatiquement compatibles avec le nouveau type.
Vous pouvez commencer à utiliser immédiatement le nouveau type de vecteur . Les exemples suivants montrent différentes langues et configurations de pilotes.
Importante
Nécessite Microsoft.Data.SqlClient 6.1.0 ou version ultérieure pour la prise en charge native des vecteurs.
static void InsertNonNullVal(SqlConnection conn)
{
Console.WriteLine("Inserting non-null value with SqlDbType");
using SqlCommand command = new SqlCommand("INSERT INTO dbo.vectors VALUES (@Id, @VectorData)", conn);
command.Parameters.AddWithValue("@Id", 1);
var vectorParameter = new SqlParameter("@VectorData", Microsoft.Data.SqlDbTypeExtensions.Vector);
vectorParameter.Value = new Microsoft.Data.SqlTypes.SqlVectorFloat32(new float[] { 3.14159f, 1.61803f, 1.41421f });
command.Parameters.Add(vectorParameter);
command.ExecuteNonQuery();
}
static void ReadWithGetValue(SqlConnection connection)
{
Console.WriteLine("Reading values using GetValue method:");
using (SqlCommand commandSourceData = new SqlCommand("SELECT v FROM dbo.vectors;", connection))
using (SqlDataReader reader = commandSourceData.ExecuteReader())
while (reader.Read())
{
var vector = reader.GetValue(0);
if (vector != null && vector != DBNull.Value)
{
Console.WriteLine("Type: " + vector.GetType() + " Element Count: " + ((SqlVectorFloat32)vector).Length);
var values = ((SqlVectorFloat32)vector).Values;
Console.WriteLine("Values: " + string.Join(", ", values));
}
}
}
Remarque
Si vous n’utilisez pas les derniers pilotes .NET, vous pouvez toujours utiliser des données vectorielles en C# en sérialisant et désérialisant celle-ci en tant que chaîne JSON à l’aide de la JsonSerializer
classe. Cela garantit la compatibilité avec la varchar(max)
représentation des vecteurs exposés par SQL Server pour les clients plus anciens.
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));
}
}
Outils
Les outils suivants prennent en charge le type de données vectorielles :
- SQL Server Management Studio version 21 et versions ultérieures
- DacFX et SqlPackage version 162.5 (novembre 2024) et versions ultérieures
- Extension SQL Server pour Visual Studio Code version 1.32 (mai 2025) et versions ultérieures
- Microsoft.Build.Sql version 1.0.0 (mars 2025) et versions ultérieures
- SQL Server Data Tools (Visual Studio 2022) version 17.13 et versions ultérieures
Limites
Le type de vecteur présente les limitations suivantes :
Tableaux
- Les contraintes au niveau des colonnes ne sont pas prises en charge, à l’exception des
NULL
/NOT NULL
contraintes.-
DEFAULT
etCHECK
contraintes ne sont pas prises en charge pour les colonnes vector. - Les contraintes clés, telles que
PRIMARY KEY
ouFOREIGN KEY
, ne sont pas prises en charge pour les colonnes vectorielles . L’égalité, l’unicité, les jointures à l’aide de colonnes vectorielles en tant que clés et les ordres de tri ne s’appliquent pas aux types de données vectorielles . - Il n’existe aucune notion d’unicité pour les vecteurs. Par conséquent, les contraintes uniques ne s’appliquent pas.
- La vérification de la plage de valeurs dans un vecteur n’est pas applicable.
-
- Les vecteurs ne prennent pas en charge la comparaison, l’addition, la soustraction, la multiplication, la division, la concaténation ou tout autre opérateur d’affectation mathématique, logique et composée.
- Les colonnes vectorielles ne peuvent pas être utilisées dans les tables optimisées en mémoire.
Index
- Les index B-tree ou columnstore ne sont pas autorisés sur les colonnes vectorielles . Toutefois, une colonne vecteur peut être spécifiée en tant que colonne incluse dans une définition d’index.
Métadonnées de schéma de table
- La procédure stockée système sp_describe_first_result_set ne retourne pas correctement le type de données vecteur. Par conséquent, de nombreux clients et pilotes d’accès aux données voient un type de données varchar ou nvarchar.
Tables de registre
- La procédure
sp_verify_database_ledger
stockée génère une erreur si la base de données contient une table avec une colonne vectorielle .
Types définis par l'utilisateur
- La création d’un type d’alias à l’aide de
CREATE TYPE
pour le type de vecteur n’est pas autorisée, comme le comportement des types de données xml et json.
Toujours Chiffré
- Le type de vecteur n’est pas pris en charge avec la fonctionnalité Always Encrypted.
Problèmes connus
- Le masquage de données affiche actuellement des données vectorielles en tant que type de données varbinary dans le portail Azure.