Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy: SQL Server 2025 (17.x)
Azure SQL Database
Azure SQL Managed Instance
SQL Database w usłudze Microsoft Fabric
Typ danych wektorów jest przeznaczony do przechowywania danych wektorowych zoptymalizowanych pod kątem operacji, takich jak wyszukiwanie podobieństwa i aplikacje uczenia maszynowego. Wektory są przechowywane w zoptymalizowanym formacie binarnym, ale są uwidocznione jako tablice JSON dla wygody. Każdy element wektora jest przechowywany jako wartość zmiennoprzecinkowa o pojedynczej precyzji (4 bajtów).
Aby zapewnić znajome doświadczenie deweloperom, typ danych wektor jest tworzony i wyświetlany jako tablica JSON. Na przykład wektor z trzema wymiarami może być reprezentowany jako '[0.1, 2, 30]'. Niejawną i jawną konwersję na i z typu wektora można wykonać przy użyciu typów varchar, nvarchar i json.
Note
Program SQL Server 2025 (17.x) obsługuje wektory o połowie precyzji (float16). Aby uzyskać więcej informacji, zobacz Obsługa zmiennoprzecinkowa o połowie precyzji w typie danych wektorowych.
float16 wektor jest obecnie dostępny dla wersji zapoznawczej. Aby przetestować, włącz PREVIEW_FEATURES opcję konfiguracji z zakresem dla bazy danych. Aby uzyskać szczegółowe informacje, przejrzyj PREVIEW_FEATURES = { ON | WYŁĄCZONE }.
ALTER DATABASE SCOPED CONFIGURATION
SET PREVIEW_FEATURES = ON;
GO
Aby uzyskać informacje o ograniczeniach, zapoznaj się z tematem Ograniczenia i znane problemy.
Note
Funkcje wektorowe są dostępne w usłudze Azure SQL Managed Instance, skonfigurowanej przy użyciu zasad [Always-up-to-date](/azure/azure-sql/managed-instance/update-policy#always-up-to-date-update-policy).
Aby uzyskać więcej informacji na temat pracy z danymi wektorowymi, zobacz:
Przykładowa składnia
Składnia użycia typu wektor jest podobna do wszystkich innych typów danych w SQL Server w tabeli.
column_name VECTOR ( { <dimensions> } ) [ NOT NULL | NULL ]
Domyślnie podstawowy typ to float32. Aby użyć połowy precyzji, należy jawnie określić float16 .
column_name VECTOR ( <dimensions> [ , <base_type> ] ) [ NOT NULL | NULL ]
Dimensions
Wektor musi mieć co najmniej jeden wymiar. Maksymalna liczba obsługiwanych wymiarów to 1998.
Examples
A. Definicja kolumny
Typ wektora można używać w definicji kolumny zawartej w instrukcji CREATE TABLE, na przykład:
Poniższy przykład tworzy tabelę z kolumną wektorową i wstawia do niej dane.
Kolumnę wektorową można zdefiniować w tabeli przy użyciu domyślnego typu podstawowego (float32) lub jawnie określić float16 dla pamięci o połowicznej precyzji.
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. Użycie w zmiennych
Poniższy przykład deklaruje wektory przy użyciu nowego typu danych wektorów i oblicza odległości przy użyciu VECTOR_DISTANCE funkcji .
Typ wektora może być używany ze zmiennymi:
DECLARE @v AS VECTOR(3) = '[0.1, 2, 30]';
SELECT @v;
DECLARE @v AS VECTOR(3, float16) = '[0.1, 2, 30]';
SELECT @v;
C. Zastosowanie w procedurach składowanych lub funkcjach
Typ danych wektor może być używany jako parametr w procedurze składowanej lub funkcji. Przykład:
CREATE PROCEDURE dbo.SampleStoredProcedure
@V VECTOR(3),
@V2 VECTOR(3) OUTPUT
AS
BEGIN
SELECT @V;
SET @V2 = @V;
END
Dostępność funkcji
Nowy typ wektora jest dostępny we wszystkich poziomach zgodności bazy danych.
float16 Obsługa wektorów jest obecnie blokowana w PREVIEW_FEATURES ramach konfiguracji.
Musisz jawnie ją włączyć przed użyciem VECTOR(..., float16).
ALTER DATABASE SCOPED CONFIGURATION
SET PREVIEW_FEATURES = ON;
GO
Conversions
- Typu wektora nie można używać z typem sql_variant, ani przypisywać do zmiennej lub kolumny typu sql_variant. To ograniczenie jest podobne do varchar(max), varbinary(max), nvarchar(max), xml, json i typów danych opartych na CLR.
Compatibility
Ulepszenia protokołu TDS
Program SQL Server przechowuje wektory w zoptymalizowanym formacie binarnym, ale uwidacznia je jako tablice JSON dla wygody.
Obsługiwane sterowniki używają ulepszeń protokołu TDS, aby wydajniej przesyłać dane wektorowe w formacie binarnym i prezentować je aplikacjom jako natywne typy wektorów. Takie podejście zmniejsza rozmiar ładunku, eliminuje obciążenie analizowania JSON i zachowuje pełną precyzję zmiennoprzecinkową. W rezultacie zwiększa wydajność i dokładność podczas pracy z wektorami o wysokim wymiarach w scenariuszach sztucznej inteligencji i uczenia maszynowego.
Note
float16 wektory są obecnie przesyłane jako varchar(max) (tablica JSON) za pośrednictwem TDS. Obsługa float16 transportu binarnego nie jest jeszcze dostępna w sterownikach, takich jak ODBC, JDBC i .NET.
Wbudowana obsługa sterowników
Aplikacje korzystające z TDS w wersji 7.4 lub nowszej i zaktualizowane sterowniki mogą natywnie odczytywać, zapisywać, strumieniowo i zbiorczo kopiować dane wektorów.
Te możliwości wymagają wersji następujących sterowników. Upewnij się, że używasz poprawnej wersji, aby włączyć obsługę wektorów natywnych.
-
Microsoft.Data.SqlClient: wersja 6.1.0 wprowadza typ
SqlVector, rozszerzającSystem.Data.SqlDbTypes. -
Sterownik JDBC firmy Microsoft dla programu SQL Server: wersja 13.1.0 (wersja zapoznawcza) wprowadza typ i
microsoft.sql.Types.VECTORklasęmicrosoft.sql.Vector.
Note
W przypadku klientów, którzy nie obsługują zaktualizowanego protokołu TDS, program SQL Server nadal uwidacznia dane wektorowe jako typy varchar(max), aby zapewnić zgodność z poprzednimi wersjami. Aplikacje klienckie mogą pracować z danymi wektorowymi tak, jakby były tablicą JSON. Silnik bazy danych SQL automatycznie konwertuje wektory na i z tablicy JSON, dzięki czemu nowy typ jest przejrzysty dla klienta. W związku z tym sterowniki i wszystkie języki są automatycznie zgodne z nowym typem.
Możesz zacząć od razu używać nowego typu wektora . W poniższych przykładach przedstawiono różne języki i konfiguracje sterowników.
Important
Wymaga programu Microsoft.Data.SqlClient 6.1.0 lub nowszego w celu obsługi wektorów natywnych.
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
Jeśli nie używasz najnowszych sterowników platformy .NET, nadal możesz pracować z danymi wektorowymi w języku C#, serializując i deserializując je jako ciąg JSON przy użyciu JsonSerializer klasy . Zapewnia to zgodność z reprezentacją varchar(max) wektorów uwidocznionych przez program SQL Server dla starszych klientów.
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
Następujące narzędzia obsługują typ danych wektorowych :
- SQL Server Management Studio w wersji 21 lub nowszej
- DacFX i SqlPackage w wersji 162.5 (listopad 2024) i nowszych wersjach
- Rozszerzenie programu SQL Server dla programu Visual Studio Code w wersji 1.32 (maj 2025 r.) i nowszych wersjach
- Microsoft.Build.Sql w wersji 1.0.0 (marzec 2025 r.) i nowszych wersjach
- SQL Server Data Tools (Visual Studio 2022) w wersji 17.13 lub nowszej
Limitations
Typ wektora ma następujące ograniczenia:
Tables
Ograniczenia na poziomie kolumny nie są obsługiwane, z wyjątkiem
NULL/NOT NULLograniczeń.DEFAULTiCHECKograniczenia nie są obsługiwane dla kolumn typu wektor.Ograniczenia klucza, takie jak
PRIMARY KEYlubFOREIGN KEY, nie są obsługiwane w przypadku kolumn wektorowych . Równość, unikatowość, sprzężenia używające kolumn wektorowych jako kluczy i kolejności sortowania nie mają zastosowania do typów danych wektorowych .Nie ma pojęcia unikatowości dla wektorów, więc unikatowe ograniczenia nie mają zastosowania.
Sprawdzanie zakresu wartości w wektorze również nie ma zastosowania.
Wektory nie obsługują porównywania, dodawania, odejmowania, mnożenia, dzielenia, łączenia ani innych operatorów matematycznych, logicznych i złożonych przypisań.
kolumn wektorowych nie można używać w tabelach zoptymalizowanych pod kątem pamięci.
Indexes
- Indeksy drzewa B lub indeksy kolumnowe nie są dozwolone w kolumnach wektor. Można jednak określić kolumnę wektorową jako dołączona kolumna w definicji indeksu.
Metadane schematu tabeli
- sp_describe_first_result_set systemowa procedura składowana nie zwraca poprawnie typu danych wektorowych . W związku z tym wiele klientów i sterowników dostępu do danych widzi typ danych varchar lub nvarchar .
Tabele rejestru
- Procedura
sp_verify_database_ledgerskładowana generuje błąd, jeśli baza danych zawiera tabelę z kolumną wektorową .
Typy zdefiniowane przez użytkownika
- Tworzenie typu aliasu przy użyciu
CREATE TYPEdla typu wektor nie jest dozwolone, podobnie jak zachowaniu typów danych xml i json.
Zawsze szyfrowane
- typ wektora nie jest obsługiwany z funkcją Always Encrypted.
Znane problemy
- Maskowanie danych obecnie pokazuje dane wektorowe jako typ danych varbinary w portalu Azure.