適用対象: SQL Server 2025 (17.x)
Azure SQL Database
Azure SQL Managed Instance
Microsoft Fabric の SQL データベース
ベクトルデータ型は、類似性探索や機械学習アプリケーションなどの操作に最適化されたベクトルデータを格納します。 ベクトルは最適化されたバイナリ形式で格納されますが、便宜上 JSON 配列として公開されます。 ベクトルの各要素は、単精度 (4 バイト) 浮動小数点値として格納されます。
開発者にとって使い慣れたエクスペリエンスを提供するために、 ベクター データ型が作成され、JSON 配列として表示されます。 たとえば、3 次元のベクトルは、 '[0.1, 2, 30]'として表すことができます。
ベクター型とvarchar、nvarchar、json型の間で暗黙的・明示的に変換できます。
ベクター データの操作の詳細については、次を参照してください。
構文例
vector 型の使用法の構文は、テーブル内の他のすべての SQL Server データ型に似ています。
column_name VECTOR ( { <dimensions> } ) [ NOT NULL | NULL ]
デフォルトでは、基本型は float32です。 半精度を使うには、float16を明示的に指定します。
column_name VECTOR ( <dimensions> [ , <base_type> ] ) [ NOT NULL | NULL ]
Dimensions
ベクトルには少なくとも 1 つの次元が必要です。 最大次元数はベクトル基底の種類に依存します:
- float32 は最大1,998次元に対応しています。
- float16 は最大3,996次元に対応しています。
使用可能な機能
ベクターデータタイプはすべてのデータベース互換性レベルで利用可能です。 ベースタイプを指定していない場合、ベクターは float32を使用します。
ベクター機能は、 Always-up-to-date ポリシーを使用して構成された Azure SQL Managed Instance で使用できます。
半精度浮動小数点(float16)ベクトル
半精度(float16)ベクトルは一般的にAzure SQL Database、Azure SQL Managed Instance、Microsoft FabricのSQLデータベースで利用可能です。 プレビュー設定は不要です。
SQL Server 2025(17.x)では、半精度(float16)ベクトルがプレビューで利用可能です。 SQL Server 2025でfloat16を使用するには、
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. 列定義
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 解析のオーバーヘッドが排除され、完全な浮動小数点精度が維持されます。 その結果、AI と機械学習のシナリオで高次元ベクトルを操作するときのパフォーマンスと精度の両方が向上します。
ネイティブ ドライバーのサポート
TDS バージョン 7.4 以降および更新されたドライバーを使用するアプリケーションでは、ベクター データの読み取り、書き込み、ストリーム、一括コピーをネイティブに行うことができます。
これらの機能には、次のドライバーのバージョンが必要です。 ネイティブ ベクターのサポートを有効にするには、正しいバージョンを使用していることを確認します。
-
Microsoft.Data.SqlClient: バージョン 6.1.0 では、
SqlVector型が導入され、System.Data.SqlDbTypesが拡張されています。 -
Microsoft JDBC Driver for SQL Server: バージョン 13.1.0 Preview では、
microsoft.sql.Types.VECTORの種類とmicrosoft.sql.Vectorクラスが導入されています。
Note
float16ベクトル用のネイティブバイナリトランスポートは、Microsoft JDBC Driver 13.4 for SQL ServerおよびMicrosoft ODBC Driver 18.7.1 for SQL Serverでサポートされています。 これらのドライバーは、ネイティブのワイヤー形式で半精度ベクトル値をシリアライズおよびデシリアライズし、JSON表現に比べてネットワークのペイロードを削減します。
ネイティブの float16 トランスポートにはこれらのドライバーバージョンまたはそれ以降の使用をしてください。 ネイティブの float16 トランスポートをサポートしないドライバーは、 varchar(max) JSON配列で表現されたベクターで引き続き動作できます。
Note
更新された TDS プロトコルをサポートしていないクライアントの場合、SQL Server は、下位互換性を確保するためにベクター データを varchar(max) 型として公開し続けます。 クライアント アプリケーションは、JSON 配列であるかのようにベクター データを操作できます。 SQL Database エンジンは、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ドライバーを使っていなくても、JsonSerializerクラスを使ってJson文字列としてシリアライズ・デシリアライズすることで、C#でベクターデータを扱うことは可能です。 このアプローチにより、SQL Server が古いクライアント向けに公開しているベクトルの varchar(max) 表現との互換性を確保できます。
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 年 11 月) 以降のバージョン
- Visual Studio Code バージョン 1.32 (2025 年 5 月) 以降のバージョンの SQL Server 拡張機能
- Microsoft.Build.Sql バージョン 1.0.0 (2025 年 3 月) 以降のバージョン
- SQL Server Data Tools (Visual Studio 2022) バージョン 17.13 以降のバージョン
Limitations
ベクター型には、次の制限があります。
Tables
列レベルの制約はサポートされていませんが、
NULL制約とNOT NULL制約のみです。DEFAULTおよびCHECK制約は、 ベクター 列ではサポートされていません。PRIMARY KEYやFOREIGN KEYなどのキー制約は、ベクター列ではサポートされていません。 等値、一意性、ベクター列をキーとして使用する結合、並べ替え順序は ベクター データ型には適用されません。ベクターの一意性の概念がないため、一意の制約は適用されません。
ベクトル内の値の範囲を確認することは適用できません。
ベクトルは、比較、加算、減算、乗算、除算、連結、またはその他の数学、論理、複合代入演算子をサポートしていません。
メモリ最適化されたテーブルでは ベクター 列は使えません。
Indexes
- ベクターカラムにはBツリーインデックスやカラムストアインデックスは使えません。 ただし、インデックス定義にベ クター 列を含めることは可能です。
- ベクトルインデックスは 、ベクトルカラムに近似インデックスを作成し、最近傍探索の性能を向上させます。 ベクトルインデックス作成やベクトル検索の仕組み、正確検索と近似検索の違いについて詳しく知りたい方は、「SQL データベース エンジンのベクター検索およびベクターインデックス」をご覧ください。
テーブル スキーマのメタデータ
- sp_describe_first_result_setシステムのストアドプロシージャはベクターデータ型を正しく返しません。 その結果、多くのデータアクセスクライアントやドライバーは varchar や nvarchar のデータ型を認識します。
台帳テーブル
- ストレージプロシージャ
sp_verify_database_ledger、データベースに ベクター 列のテーブルが含まれている場合エラーを生成します。
ユーザー定義型
-
ベクタータイプに
CREATE TYPEを使ってエイリアスタイプを作成することはできません。 この制限は 、xml や json のデータ型の挙動に似ています。
常に暗号化されています
- ベ クター タイプはAlways Encrypted機能ではサポートされていません。
既知の問題
- データ マスクは現在、Azure portal で ベクター データを varbinary データ型として表示しています。