Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Gilt für: SQL Server 2025 (17.x)
Azure SQL-Datenbank
Azure SQL Managed Instance
SQL-Datenbank in Microsoft Fabric
Der Vektordatentyp speichert Vektordaten, die für Operationen wie Ähnlichkeitssuche und Anwendungen für maschinelles Lernen optimiert sind. Vektoren werden in einem optimierten Binärformat gespeichert, aber zur Bequemlichkeit als JSON-Arrays dargestellt. Jedes Element des Vektors wird als Einzelpräzisionswert (4-Byte) im Gleitkommaformat gespeichert.
Um Entwicklern eine vertraute Erfahrung zu bieten, wird der Vektordatentyp erstellt und als JSON-Array angezeigt. Beispielsweise kann ein Vektor mit drei Dimensionen als '[0.1, 2, 30]'dargestellt werden. Du kannst implizit und explizit zwischen dem Vektortyp und den Typen varchar, nvarchar und json konvertieren.
Weitere Informationen zum Arbeiten mit Vektordaten finden Sie unter:
Beispielsyntax
Die Verwendungssyntax für den Vektortyp ähnelt allen anderen SQL Server-Datentypen in einer Tabelle.
column_name VECTOR ( { <dimensions> } ) [ NOT NULL | NULL ]
Standardmäßig ist der Basistyp float32. Um Halbpräzision zu verwenden, gib explizit float16 an.
column_name VECTOR ( <dimensions> [ , <base_type> ] ) [ NOT NULL | NULL ]
Dimensions
Ein Vektor muss mindestens eine Dimension haben. Die maximale Anzahl der Dimensionen hängt vom Vektorbasistyp ab:
- float32 unterstützt bis zu 1.998 Dimensionen.
- float16 unterstützt bis zu 3.996 Dimensionen.
Verfügbarkeit von Funktionen
Der Vektordatentyp ist unter allen Datenbankkompatibilitätsstufen verfügbar. Wenn du keinen Basistyp angibst, verwendet der Vektor float32.
Vektor-Funktionen sind in Azure SQL Managed Instance verfügbar, die mit der Always-up-to-date-Richtlinie konfiguriert ist.
Halbpräzisions-Float16-Vektoren
Halbpräzisionsvektoren (float16) sind im Allgemeinen in Azure SQL-Datenbank, Azure SQL Managed Instance und SQL Database in Microsoft Fabric verfügbar. Eine Vorschaukonfiguration ist nicht erforderlich.
In SQL Server 2025 (17.x) sind Halbpräzisionsvektoren (float16) in der Vorschau verfügbar. Um float16 in SQL Server 2025 zu verwenden, müssen Sie die
PREVIEW_FEATURESDatenbank-Scoped-Konfigurationsoption aktivieren. Weitere Informationen finden Sie unter Vorschaufunktionen in SQL Server 2025 aktivieren.
Für weitere Informationen zu Halbpräzisionsvektoren siehe Halbpräzisions-Gleitmittelunterstützung im Vektordatentyp.
Vorschaufunktionen in SQL Server 2025 aktivieren
Für einige Vorschaufunktionen in SQL Server 2025 müssen Sie die datenbankbezogene Konfigurationsoption PREVIEW_FEATURES aktivieren.
ALTER DATABASE SCOPED CONFIGURATION
SET PREVIEW_FEATURES = ON;
GO
Weitere Informationen finden Sie PREVIEW_FEATURES.
Examples
A. Spaltendefinition
Verwenden Sie den Vektortyp in Spaltendefinitionen innerhalb einer CREATE TABLE Anweisung. Beispiel:
Das folgende Beispiel erstellt eine Tabelle mit einer Vektor-Spalte und fügt Daten in diese ein.
Definieren Sie eine Vektorspalte in einer Tabelle, indem Sie entweder den Standardbasistyp float32 oder float16 für halbpräzise Speicherung verwenden.
CREATE TABLE dbo.vectors
(
id INT PRIMARY KEY,
v VECTOR(3) NOT NULL -- Uses default base type (**float32**)
);
CREATE TABLE dbo.vectors_fp16
(
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. Verwendung in Variablen
Das folgende Beispiel deklariert Vektoren mit dem neuen Vektordatentyp und berechnet Abstände mit der VECTOR_DISTANCE Funktion.
Verwenden Sie den Vektortyp mit Variablen:
DECLARE @v AS VECTOR(3) = '[0.1, 2, 30]';
SELECT @v;
GO
DECLARE @v AS VECTOR(3, float16) = '[0.1, 2, 30]';
SELECT @v;
C. Verwendung in gespeicherten Prozeduren oder Funktionen
Man kann den Vektordatentyp als Parameter in gespeicherten Prozeduren oder Funktionen verwenden. Beispiel:
CREATE PROCEDURE dbo.SampleStoredProcedure
@V VECTOR(3),
@V2 VECTOR(3) OUTPUT
AS
BEGIN
SELECT @V;
SET @V2 = @V;
END
Conversions
- Du kannst den Vektortyp nicht mit dem sql_variant Typ verwenden oder ihn einer sql_variant Variablen oder Spalte zuweisen. Diese Einschränkung ähnelt varchar(max), varbinary(max), nvarchar(max), xml, json und CLR-basierten Datentypen.
Compatibility
Verbesserungen am TDS-Protokoll
SQL Server speichert Vektoren in einem optimierten Binärformat, macht sie aber als JSON-Arrays verfügbar.
Unterstützte Treiber verwenden Verbesserungen am TDS-Protokoll, um Vektordaten effizienter im Binärformat zu übertragen und anwendungen als systemeigene Vektortypen zu präsentieren. Dieser Ansatz reduziert die Größe des Payloads, eliminiert den Overhead des JSON-Parsing und bewahrt die volle Gleitkommagenauigkeit. Daher verbessert es sowohl die Leistung als auch die Genauigkeit bei der Arbeit mit hochdimensionalen Vektoren in KI- und Machine Learning-Szenarien.
Unterstützung von nativen Treibern
Anwendungen mit TDS Version 7.4 oder höher und aktualisierten Treibern können Vektordaten nativ lesen, schreiben, streamen und massenkopien.
Für diese Funktionen sind Versionen der folgenden Treiber erforderlich. Stellen Sie sicher, dass Sie die richtige Version verwenden, um die systemeigene Vektorunterstützung zu aktivieren.
-
Microsoft.Data.SqlClient: Version 6.1.0 führt den Typ
SqlVectorein, derSystem.Data.SqlDbTypeserweitert. -
Microsoft JDBC-Treiber für SQL Server: Version 13.1.0 Preview führt den
microsoft.sql.Types.VECTORTyp und diemicrosoft.sql.VectorKlasse ein.
Note
Native binärer Transport für float16-Vektoren wird in Microsoft JDBC Driver 13.4 für SQL Server und Microsoft ODBC Driver 18.7.1 für SQL Server unterstützt. Diese Treiber serialisieren und deserialisieren halbpräzise Vektorwerte mit dem nativen Drahtformat, wodurch die Netzwerknutzlast im Vergleich zur JSON-Darstellung reduziert wird.
Verwenden Sie diese Treiberversionen oder später für den nativen float16-Transport . Treiber, die den nativen float16-Transport nicht unterstützen, können weiterhin mit Vektoren arbeiten, die als varchar(max) JSON-Arrays dargestellt werden.
Note
Für Clients, die das aktualisierte TDS-Protokoll nicht unterstützen, macht SQL Server weiterhin Vektordaten als varchar(max)- Typen verfügbar, um die Abwärtskompatibilität sicherzustellen. Clientanwendungen können mit Vektordaten arbeiten, als wäre es ein JSON-Array. Das SQL-Datenbankmodul konvertiert automatisch Vektoren in und aus einem JSON-Array, wodurch der neue Typ für den Client transparent wird. Daher sind Treiber und alle Sprachen automatisch mit dem neuen Typ kompatibel.
Sie können sofort mit der Verwendung des neuen Vektortyps beginnen. Die folgenden Beispiele zeigen verschiedene Sprachen und Treiberkonfigurationen.
Important
Erfordert Microsoft.Data.SqlClient 6.1.0 oder höher für native Vektorunterstützung.
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
Wenn du nicht die neuesten .NET-Treiber verwendest, kannst du trotzdem mit Vektordaten in C# arbeiten, indem du sie als JSON-String serialisiert und deserialisiert, indem du die Klasse nutztJsonSerializer. Dieser Ansatz stellt die Kompatibilität mit der varchar(max) Darstellung der Vektoren sicher, die SQL Server für ältere Clients bereitstellt.
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
Die folgenden Tools unterstützen den Vektordatentyp :
- SQL Server Management Studio , Version 21 und höher
- DacFX und SqlPackage , Version 162.5 (November 2024) und höhere Versionen
- Die SQL Server-Erweiterung für Visual Studio Code , Version 1.32 (Mai 2025) und höhere Versionen
- Microsoft.Build.Sql Version 1.0.0 (März 2025) und höhere Versionen
- SQL Server Data Tools (Visual Studio 2022) Version 17.13 und höhere Versionen
Limitations
Der Vektortyp hat die folgenden Einschränkungen:
Tables
Einschränkungen auf Spaltenebene werden nicht unterstützt, außer den Einschränkungen
NULLundNOT NULL.DEFAULTundCHECKEinschränkungen werden für Vektorspalten nicht unterstützt.Schlüsseleinschränkungen, wie
PRIMARY KEYoderFOREIGN KEY, werden für Vektorspalten nicht unterstützt. Gleichheit, Eindeutigkeit, Verknüpfungen mithilfe von Vektorspalten als Schlüssel und Sortierreihenfolgen gelten nicht für Vektordatentypen .Es gibt keine Vorstellung von Eindeutigkeit für Vektoren, sodass eindeutige Einschränkungen nicht anwendbar sind.
Die Überprüfung des Wertebereichs innerhalb eines Vektors ist nicht anwendbar.
Vektoren unterstützen keine Vergleichs-, Additions-, Subtraktions-, Multiplikations-, Divisions-, Verkettungs- oder anderen mathematischen, logischen und zusammengesetzten Zuordnungsoperatoren.
Man kann keine Vektorspalten in speicheroptimierten Tabellen verwenden.
Indexes
- Man kann keine B-Baum-Indizes oder Spaltenspeicher-Indizes auf Vektorspalten verwenden. Man kann jedoch eine Vektorspalte als enthaltene Spalte in eine Indexdefinition einbeziehen.
- Vektorindizes erzeugen einen approximativen Index auf einer Vektorspalte, um die Leistung der Suche nach den nächsten Nachbarn zu verbessern. Um mehr darüber zu erfahren, wie Vektorindexierung und Vektorsuche funktionieren und welche Unterschiede zwischen exakter und approximativer Suche sind, siehe Vektorsuche und Vektorindexe in der SQL Datenbank-Engine.
Tabellenschema-Metadaten
- Das sp_describe_first_result_set System gespeicherte Prozedur gibt den Vektordatentyp nicht korrekt zurück. Daher sehen viele Datenzugriffsclients und -treiber einen Varchar - oder nvarchar-Datentyp .
Ledger-Tabellen
- Das gespeicherte Verfahren
sp_verify_database_ledgererzeugt einen Fehler, wenn die Datenbank eine Tabelle mit einer Vektorspalte enthält.
Benutzerdefinierte Typen
- Du kannst keinen Alias-Typ mit
CREATE TYPEfür den Vektortyp erstellen. Diese Einschränkung ähnelt dem Verhalten der XML- und JSON-Datentypen .
Immer Verschlüsselt
- Der Vektortyp wird mit der Funktion "Immer verschlüsselt" nicht unterstützt.
Bekannte Probleme
- Die Datenmaskierung zeigt derzeit Vektordaten als varbinary Datentyp im Azure-Portal an.