Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Применимо к: SQL Server 2025 (17.x)
База данных Azure SQL
Управляемый экземпляр Azure SQL
SQL база данных в Microsoft Fabric
Векторный тип данных хранит векторные данные, оптимизированные для операций, таких как поиск сходства и приложения машинного обучения. Векторы хранятся в оптимизированном двоичном формате, но предоставляются в виде массивов JSON для удобства. Каждый элемент вектора хранится в виде значения одинарной точности с плавающей запятой (4 байта).
Чтобы предоставить знакомый интерфейс для разработчиков, тип векторных данных создается и отображается в виде массива JSON. Например, вектор с тремя измерениями можно представить как '[0.1, 2, 30]'. Преобразование между типом вектора и типами char, nchar, varchar, nvarchar и json может быть как неявным, так и явным в обоих направлениях. Преобразование между vector и всеми другими типами данных запрещено. Преобразование между двумя значениями векторов возможно только тогда, когда размеры и базовый тип (float32 или float16) совпадают; в противном случае возникает ошибка 42204 или 42238.
Когда вы преобразуете строку или значение json в вектор, значение должно быть JSON-массивом чисел. Количество элементов должно быть равно размерности вектора; в противном случае возникает ошибка 42204. Другие значения вызывают ошибку 13670. Белое пространство до и после массива игнорируется.
При преобразовании vector в тип строки результат использует научную нотацию, например [1.0000000e+000,2.5000000e+000,-3.0000000e+000]. При преобразовании vector в json результат использует десятичную нотацию, например [1.0000000000,2.5000000000,-3.0000000000]. Если целевая длина слишком коротка, возникает ошибка 42211. Значение не усекается.
vector имеет меньший приоритет, чем типы строк. В UNION, CASE, COALESCEи других выражениях, объединяющих вектор с типом строки, результатом является тип строки.
Дополнительные сведения о работе с векторными данными см. в следующем разделе:
Пример синтаксиса
Синтаксис использования для типа вектора аналогичен всем другим типам данных SQL Server в таблице.
column_name VECTOR ( { <dimensions> } ) [ NOT NULL | NULL ]
По умолчанию базовый тип — float32. Чтобы использовать half-precision, указывайте float16 явно.
column_name VECTOR ( <dimensions> [ , <base_type> ] ) [ NOT NULL | NULL ]
Dimensions
Вектор должен иметь по крайней мере одно измерение. Максимальное количество размерностей зависит от типа векторной базы:
- float32 поддерживает до 1 998 измерений.
- float16 поддерживает до 3 996 измерений.
Доступность функций
Векторный тип данных доступен на всех уровнях совместимости баз данных. Если вы не указываете тип базы, вектор использует float32.
Функции векторов доступны в Управляемом экземпляре SQL Azure, настроенном с помощью политики Always-up-to-date .
Векторы половинной точности (float16)
Векторы с половинной точностью (float16) обычно доступны в База данных SQL Azure, Управляемый экземпляр SQL Azure и SQL Database в Microsoft Fabric. Конфигурация предварительного просмотра не требуется.
В SQL Server 2025 (17.x) доступны векторы полуточности (float16) в предварительном просмотре. Чтобы использовать float16 в SQL Server 2025, необходимо включить
PREVIEW_FEATURESопцию конфигурации с областью действия базы данных. Для получения дополнительной информации см. раздел «Включить функции предварительного просмотра в SQL Server 2025».
Для получения дополнительной информации о векторах с половинной точностью см. раздел «Поддержка чисел с плавающей запятой половинной точности в векторном типе данных».
Включите функции предварительного просмотра в SQL Server 2025
Для некоторых предварительных возможностей в SQL Server 2025 необходимо включить параметр конфигурации области базы данных PREVIEW_FEATURES.
ALTER DATABASE SCOPED CONFIGURATION
SET PREVIEW_FEATURES = ON;
GO
Для получения дополнительной информации см. PREVIEW_FEATURES.
Examples
A. Определение столбца
Используйте тип vector в определениях столбцов в инструкции CREATE TABLE. Рассмотрим пример.
В следующем примере создается таблица с векторным столбцом и вставляет в нее данные.
Определите векторный столбец в таблице, используя либо базовый тип по умолчанию float32 , либо float16 для хранения с половинной точностью.
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. Использование в переменных
Следующий пример объявляет векторы с помощью нового типа векторных данных и вычисляет расстояния с помощью функции VECTOR_DISTANCE .
Используйте тип вектора с переменными:
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. Использование в хранимых процедурах или функциях
Векторный тип данных можно использовать как параметр в хранимых процедурах или функциях. Рассмотрим пример.
CREATE PROCEDURE dbo.SampleStoredProcedure
(
@V VECTOR(3),
@V2 VECTOR(3) OUTPUT
)
AS
BEGIN
SELECT @V;
SET @V2 = @V;
END
Conversions
- Нельзя использовать векторный тип с типом sql_variant или назначать его sql_variant переменной или столбцу. Это ограничение аналогично типам данных varchar(max), varbinary(max), nvarchar(max), xml, json и CLR.
Compatibility
Усовершенствования протокола TDS
SQL Server сохраняет векторы в оптимизированном двоичном формате, но предоставляет их в виде массивов JSON для удобства.
Поддерживаемые драйверы используют усовершенствования протокола TDS для более эффективной передачи векторных данных в двоичном формате и представления их приложениям в качестве собственных типов векторов. Этот подход снижает размер полезных данных, устраняет затраты на анализ JSON и сохраняет полную точность с плавающей запятой. В результате это повышает производительность и точность при работе с высокомерными векторами в сценариях искусственного интеллекта и машинного обучения.
Поддержка собственного драйвера
Приложения, использующие TDS версии 7.4 или выше и обновленные драйверы, могут нативно считывать, записывать, стримить и массово копировать векторные данные.
Для этих возможностей требуются версии следующих драйверов. Убедитесь, что вы используете правильную версию для включения поддержки собственных векторов.
- Microsoft.Data.SqlClient: версия 6.1.0 представляет тип , который расширяет .
-
Microsoft JDBC Driver for SQL Server: версия 13.1.0 Preview представляет
microsoft.sql.Types.VECTORтип иmicrosoft.sql.Vectorкласс.
Note
Нативный двоичный транспорт для векторов float16 поддерживается в Microsoft JDBC Driver 13.4 для SQL Server и Microsoft ODBC Driver 18.7.1 для SQL Server. Эти драйверы сериализуют и десериализуют значения векторов с половинной точностью, используя собственный формат передачи по сети, что уменьшает объём передаваемых данных по сравнению с JSON-представлением.
Используйте эти или более поздние версии драйверов для нативной поддержки передачи float16. Драйверы, не поддерживающие нативный транспорт float16 , могут продолжать работать с векторами, представленными в varchar(max) виде JSON-массивов.
Note
Для клиентов, не поддерживающих обновленный протокол TDS, SQL Server продолжает предоставлять векторные данные как типы varchar(max), чтобы обеспечить обратную совместимость. Клиентские приложения могут работать с векторными данными, как если бы это был массив JSON. Ядро СУБД SQL автоматически преобразует векторы в массив JSON и из нее, что делает новый тип прозрачным для клиента. Поэтому драйверы и все языки автоматически совместимы с новым типом.
Вы можете сразу начать использовать новый тип вектора . В следующих примерах показаны различные языки и конфигурации драйверов.
Important
Требуется Microsoft.Data.SqlClient 6.1.0 или более поздней версии для поддержки собственных векторов.
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
Если вы не используете последние драйверы .NET, вы всё равно можете работать с векторными данными на C#, сериализируя и десериализируя их как JSON-строку с помощью классаJsonSerializer. Такой подход обеспечивает совместимость с varchar(max) представлением векторов, которые SQL Server предоставляет для старых клиентов.
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
Следующие средства поддерживают тип векторных данных:
- SQL Server Management Studio версии 21 и более поздних версий
- DacFX и SqlPackage версии 162.5 (ноябрь 2024) и более поздние версии
- Расширение SQL Server для Visual Studio Code версии 1.32 (май 2025 г.) и более поздних версий
- Microsoft.Build.Sql версии 1.0.0 (март 2025 г.) и более поздних версий
- SQL Server Data Tools (Visual Studio 2022) версии 17.13 и более поздних версий
Limitations
Тип вектора имеет следующие ограничения:
Tables
Ограничения на уровне столбцов не поддерживаются, за исключением ограничений
NULLиNOT NULL.DEFAULTиCHECKограничения не поддерживаются для векторных столбцов.Ограничения ключей, такие как
PRIMARY KEYилиFOREIGN KEY, не поддерживаются для векторных столбцов. Равенство, уникальность, соединения с использованием векторных столбцов в качестве ключей и порядок сортировки не применяются к типам векторных данных.Нет понятия уникальности для векторов, поэтому уникальные ограничения не применимы.
Проверка диапазона значений внутри вектора не применима.
Векторы не поддерживают сравнение, добавление, вычитание, умножение, деление, объединение или другие математические, логические и составные операторы назначения.
Векторные столбцы нельзя использовать в таблицах с оптимизацией памяти.
Indexes
- Нельзя использовать индексы B-дерева или индексы Columnstore на векторных столбцах. Однако вы можете включить векторный столбец как включённый столбец в определение индекса.
- Векторные индексы создают приблизительный индекс на векторном столбце для повышения эффективности поиска ближайших соседей. Чтобы узнать больше о том, как работает векторное индексирование и векторный поиск, а также о различиях между точным и приблизительным поиском, см. раздел векторный поиск и векторные индексы в SQL ядро СУБД.
Метаданные схемы таблицы
- Процедура сохранения sp_describe_first_result_set системы некорректно возвращает векторный тип данных. В результате многие клиенты и драйверы доступа к данным видят тип данных varchar или nvarchar .
Таблицы реестра
- Сохранённая процедура
sp_verify_database_ledgerгенерирует ошибку, если база данных содержит таблицу с векторным столбцом.
Определяемые пользователем типы
- Вы не можете создать тип псевдонима, используя
CREATE TYPEвекторный тип. Это ограничение похоже на поведение типов данных xml и json .
Всегда зашифровано
- Векторный тип не поддерживается с функцией Always Encrypted.
Известные проблемы
- Маскирование данных в настоящее время отображает векторные данные в качестве типа данных varbinary на портале Azure.
Связанный контент
- Поддержка чисел с плавающей запятой половинной точности в векторном типе данных
- Векторный поиск и векторные индексы в ядро СУБД SQL
- Интеллектуальные приложения
- Векторные функции