Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Berlaku untuk: SQL Server 2025 (17.x)
Azure SQL Database
Azure SQL Managed Instance
SQL database di Microsoft Fabric
Jenis data vektor dirancang untuk menyimpan data vektor yang dioptimalkan untuk operasi seperti pencarian kesamaan dan aplikasi pembelajaran mesin. Vektor disimpan dalam format biner yang dioptimalkan tetapi diekspos sebagai array JSON untuk kenyamanan. Setiap elemen vektor disimpan sebagai nilai floating-point presisi tunggal (4-byte).
Untuk memberikan pengalaman yang familier bagi pengembang, jenis data vektor dibuat dan ditampilkan sebagai array JSON. Misalnya, vektor dengan tiga dimensi dapat direpresentasikan sebagai '[0.1, 2, 30]'. Konversi implisit dan eksplisit dari dan ke jenis vektor dapat dilakukan menggunakan jenis varchar, nvarchar, dan json .
Note
SQL Server 2025 (17.x) mendukung vektor setengah presisi (float16). Untuk informasi selengkapnya, lihat Dukungan float setengah presisi dalam jenis data vektor.
float16 vektor saat ini tersedia untuk pratinjau. Untuk menguji, aktifkan PREVIEW_FEATURES opsi konfigurasi terlingkup database. Untuk detailnya, tinjau PREVIEW_FEATURES = { ON | NONAKTIF }.
ALTER DATABASE SCOPED CONFIGURATION
SET PREVIEW_FEATURES = ON;
GO
Untuk batasan, tinjau Batasan dan Masalah yang diketahui.
Note
Fitur vektor tersedia di Azure SQL Managed Instance yang dikonfigurasi dengan kebijakan Always-up-to-date .
Untuk informasi selengkapnya tentang bekerja dengan data vektor, lihat:
Contoh sintaks
Sintaks penggunaan untuk jenis vektor mirip dengan semua jenis data SQL Server lainnya dalam tabel.
column_name VECTOR ( { <dimensions> } ) [ NOT NULL | NULL ]
Secara default, jenis dasarnya adalah float32. Untuk menggunakan presisi setengah, Anda perlu menentukan float16 secara eksplisit.
column_name VECTOR ( <dimensions> [ , <base_type> ] ) [ NOT NULL | NULL ]
Dimensions
Vektor harus memiliki setidaknya satu dimensi. Jumlah maksimum dimensi yang didukung adalah 1998.
Examples
A. Definisi kolom
Dalam pernyataan CREATE TABLE, jenis vektor dapat digunakan dalam definisi kolom, misalnya:
Contoh berikut membuat tabel dengan kolom vektor dan menyisipkan data ke dalamnya.
Anda dapat menentukan kolom vektor dalam tabel menggunakan jenis dasar default (float32) atau secara eksplisit menentukan float16 untuk penyimpanan setengah presisi.
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. Penggunaan dalam variabel
Contoh berikut mendeklarasikan vektor menggunakan jenis data vektor baru dan menghitung jarak menggunakan VECTOR_DISTANCE fungsi .
Jenis vektor dapat digunakan dengan variabel:
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. Penggunaan dalam prosedur atau fungsi tersimpan
Jenis data vektor dapat digunakan sebagai parameter dalam prosedur atau fungsi tersimpan. Contohnya:
CREATE PROCEDURE dbo.SampleStoredProcedure
@V VECTOR(3),
@V2 VECTOR(3) OUTPUT
AS
BEGIN
SELECT @V;
SET @V2 = @V;
END
Ketersediaan fitur
Jenis vektor baru tersedia di bawah semua tingkat kompatibilitas database.
Dukungan untuk fitur float16 saat ini dibatasi di bawah konfigurasi PREVIEW_FEATURES.
Anda harus mengaktifkannya secara eksplisit sebelum menggunakan VECTOR(..., float16).
ALTER DATABASE SCOPED CONFIGURATION
SET PREVIEW_FEATURES = ON;
GO
Conversions
- Jenis vektor tidak dapat digunakan dengan jenis sql_variant atau ditetapkan ke variabel atau kolom sql_variant . Pembatasan ini mirip dengan varchar(max), varbinary(max), nvarchar(max), xml, json, dan jenis data berbasis CLR.
Compatibility
Penyempurnaan protokol TDS
SQL Server menyimpan vektor dalam format biner yang dioptimalkan tetapi mengeksposnya sebagai array JSON untuk kenyamanan.
Driver yang didukung menggunakan penyempurnaan pada protokol TDS untuk mengirimkan data vektor secara lebih efisien dalam format biner dan menyajikannya ke aplikasi sebagai jenis vektor asli. Pendekatan ini mengurangi ukuran payload, menghilangkan overhead penguraian format JSON, dan mempertahankan presisi titik mengambang penuh. Akibatnya, ia meningkatkan performa dan akurasi saat bekerja dengan vektor dimensi tinggi dalam AI dan skenario pembelajaran mesin.
Note
float16 vektor saat ini ditransmisikan sebagai varchar(max) (array JSON) melalui TDS. Dukungan transportasi biner untuk float16 belum tersedia di driver seperti ODBC, JDBC, dan .NET.
Dukungan Driver Asli
Aplikasi yang menggunakan TDS versi 7.4 atau lebih tinggi dan driver yang diperbarui dapat membaca, menulis, mengalirkan, dan menyalin data vektor secara massal secara asli.
Kemampuan ini memerlukan versi driver berikut. Pastikan Anda menggunakan versi yang benar untuk mengaktifkan dukungan vektor asli.
-
Microsoft.Data.SqlClient: Versi 6.1.0 memperkenalkan tipe baru,
SqlVector, yang memperluasSystem.Data.SqlDbTypes. -
Microsoft JDBC Driver untuk SQL Server: Versi 13.1.0 Pratinjau memperkenalkan
microsoft.sql.Types.VECTORtipe danmicrosoft.sql.Vectorkelas.
Note
Untuk klien yang tidak mendukung protokol TDS yang diperbarui, SQL Server terus mengekspos data vektor sebagai jenis varchar(max) untuk memastikan kompatibilitas mundur. Aplikasi klien dapat bekerja dengan data vektor seolah-olah itu adalah array JSON. SQL Database Engine secara otomatis mengonversi vektor ke dan dari array JSON, membuat jenis baru transparan untuk klien. Oleh karena itu driver dan semua bahasa secara otomatis kompatibel dengan jenis baru.
Anda dapat segera mulai menggunakan jenis vektor baru. Contoh berikut menunjukkan berbagai bahasa dan konfigurasi driver.
Important
Memerlukan Microsoft.Data.SqlClient 6.1.0 atau yang lebih baru untuk dukungan vektor asli.
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
Jika Anda tidak menggunakan driver .NET terbaru, Anda masih dapat bekerja dengan data vektor di C# dengan menserialisasikan dan mendeserialisasinya sebagai string JSON menggunakan JsonSerializer kelas . Ini memastikan kompatibilitas dengan varchar(max) representasi vektor yang diekspos oleh SQL Server untuk klien yang lebih lama.
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
Alat berikut mendukung jenis data vektor :
- SQL Server Management Studio versi 21 dan versi yang lebih baru
- DacFX dan SqlPackage versi 162.5 (November 2024) dan versi yang lebih baru
- Ekstensi SQL Server untuk Visual Studio Code versi 1.32 (Mei 2025) dan versi yang lebih baru
- Microsoft.Build.Sql versi 1.0.0 (Maret 2025) dan versi yang lebih baru
- SQL Server Data Tools (Visual Studio 2022) versi 17.13 dan versi yang lebih baru
Limitations
Jenis vektor memiliki batasan berikut:
Tables
Batasan tingkat kolom tidak didukung, kecuali untuk
NULL/NOT NULLbatasan.DEFAULTdanCHECKbatasan tidak didukung untuk kolom vektor .Batasan utama, seperti
PRIMARY KEYatauFOREIGN KEY, tidak didukung untuk kolom vektor . Kesetaraan, keunikan, gabungan menggunakan kolom vektor sebagai kunci, dan urutan pengurutan tidak berlaku untuk jenis data vektor .Tidak ada gagasan keunikan untuk vektor, sehingga batasan unik tidak berlaku.
Memeriksa rentang nilai dalam vektor juga tidak berlaku.
Vektor tidak mendukung perbandingan, penambahan, pengurangan, perkalian, pembagian, perangkaian, atau operator penugasan matematika, logis, dan majemuk lainnya.
Kolom vektor tidak dapat digunakan dalam tabel yang dioptimalkan memori.
Indexes
- Indeks pohon B atau indeks penyimpan kolom tidak diperbolehkan pada kolom vektor . Namun, kolom vektor dapat ditentukan sebagai kolom yang disertakan dalam definisi indeks.
Metadata skema tabel
- sp_describe_first_result_set prosedur tersimpan sistem tidak mengembalikan jenis data vektor dengan benar. Oleh karena itu, banyak klien akses data dan driver melihat jenis data varchar atau nvarchar.
Tabel buku besar
- Prosedur
sp_verify_database_ledgertersimpan menghasilkan kesalahan jika database berisi tabel dengan kolom vektor .
Jenis yang ditentukan pengguna
- Pembuatan jenis alias yang digunakan
CREATE TYPEuntuk jenis vektor tidak diizinkan, mirip dengan perilaku jenis data xml dan json .
Selalu Terenkripsi
- Jenis vektor tidak didukung dengan fitur Always Encrypted.
Masalah yang diketahui
- Masking Data saat ini menunjukkan data vektor sebagai jenis data varbinary di portal Microsoft Azure.