適用対象: SQL Server 2025 (17.x) プレビュー
Azure SQL Database
Azure SQL Managed Instance
SQL データベース
vector データ型は、類似性検索や機械学習アプリケーションなどの操作用に最適化されたベクトル データを格納するように設計されています。 ベクトルは最適化されたバイナリ形式で格納されますが、便宜上 JSON 配列として公開されます。 ベクトルの各要素は、単精度 (4 バイト) 浮動小数点値として格納されます。
開発者にとって使い慣れたエクスペリエンスを提供するために、 ベクター データ型が作成され、JSON 配列として表示されます。 たとえば、3 次元のベクトルは、 '[0.1, 2, 30]'
として表すことができます。
ベクター型との間の暗黙的および明示的な変換は、varchar、nvarchar、json 型を使用して行うことができます。
注
制限事項については、 制限事項 と 既知の問題を確認してください。
ベクター機能は、 Always-up-to-date ポリシーを使用して構成された Azure SQL Managed Instance で使用できます。
ベクター データの操作の詳細については、次を参照してください。
構文例
vector 型の使用法の構文は、テーブル内の他のすべての SQL Server データ型に似ています。
column_name VECTOR( {<dimensions>} ) [NOT NULL | NULL]
次元
ベクトルには少なくとも 1 つの次元が必要です。 サポートされている次元の最大数は 1998 です。
例
A。 列の定義
vector 型は、CREATE TABLE
ステートメントに含まれる列定義で使用できます。次に例を示します。
次の例では、ベクトル列を含むテーブルを作成し、それにデータを挿入します。
CREATE TABLE dbo.vectors
(
id INT PRIMARY KEY,
v VECTOR(3) NOT NULL
);
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 データ型を使用してベクトルを宣言し、VECTOR_DISTANCE
関数を使用して距離を計算しています。
vector 型は変数と共に使用できます。
DECLARE @v VECTOR(3) = '[0.1, 2, 30]';
SELECT @v;
C: ストアド プロシージャまたは関数での使用
vector データ型は、ストアド プロシージャまたは関数のパラメーターとして使用できます。 次に例を示します。
CREATE PROCEDURE dbo.SampleStoredProcedure
@V VECTOR(3),
@V2 VECTOR(3) OUTPUT
AS
BEGIN
SELECT @V;
SET @V2 = @V;
END
機能の利用可能性
新しい vector 型は、すべてのデータベース互換性レベルで使用できます。
変換
- vector 型は、sql_variant 型と共に使用することはできず、sql_variant の変数または列に割り当てることもできません。 この制限は、 varchar(max)、 varbinary(max)、 nvarchar(max)、 xml、 json、CLR ベースのデータ型に似ています。
互換性
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
クラスが導入されています。
注
更新された TDS プロトコルをサポートしていないクライアントの場合、SQL Server は、下位互換性を確保するためにベクター データを varchar(max) 型として公開し続けます。 クライアント アプリケーションは、JSON 配列であるかのようにベクター データを操作できます。 SQL Database エンジンは、JSON 配列との間でベクターを自動的に変換し、新しい型をクライアントに対して透過的にします。 そのため、ドライバーとすべての言語は、新しい型と自動的に互換性があります。
すぐに新しい ベクター 型の使用を開始できます。 次の例は、さまざまな言語とドライバーの構成を示しています。
Von Bedeutung
ネイティブ ベクターをサポートするには 、Microsoft.Data.SqlClient 6.1.0 以降が必要です。
static void InsertNonNullVal(SqlConnection conn)
{
Console.WriteLine("Inserting non-null value with SqlDbType");
using SqlCommand command = new SqlCommand("INSERT INTO dbo.vectors VALUES (@Id, @VectorData)", conn);
command.Parameters.AddWithValue("@Id", 1);
var vectorParameter = new SqlParameter("@VectorData", Microsoft.Data.SqlDbTypeExtensions.Vector);
vectorParameter.Value = new Microsoft.Data.SqlTypes.SqlVectorFloat32(new float[] { 3.14159f, 1.61803f, 1.41421f });
command.Parameters.Add(vectorParameter);
command.ExecuteNonQuery();
}
static void ReadWithGetValue(SqlConnection connection)
{
Console.WriteLine("Reading values using GetValue method:");
using (SqlCommand commandSourceData = new SqlCommand("SELECT v FROM dbo.vectors;", connection))
using (SqlDataReader reader = commandSourceData.ExecuteReader())
while (reader.Read())
{
var vector = reader.GetValue(0);
if (vector != null && vector != DBNull.Value)
{
Console.WriteLine("Type: " + vector.GetType() + " Element Count: " + ((SqlVectorFloat32)vector).Length);
var values = ((SqlVectorFloat32)vector).Values;
Console.WriteLine("Values: " + string.Join(", ", values));
}
}
}
注
最新の .NET ドライバーを使用していない場合でも、 クラスを使用して JSON 文字列としてシリアル化および逆シリアル化することで、JsonSerializer
でベクター データを操作できます。 これにより、古いクライアントに対して 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));
}
}
ツール
次のツールは 、ベクター データ型をサポートしています。
- 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 以降のバージョン
制限事項
ベクター型には、次の制限があります。
テーブル
- 列レベルの制約は、
NULL
/NOT NULL
制約を除き、サポートされていません。-
DEFAULT
およびCHECK
制約は、 ベクター 列ではサポートされていません。 -
PRIMARY KEY
やFOREIGN KEY
などのキー制約は、ベクター列ではサポートされていません。 等値、一意性、ベクター列をキーとして使用する結合、並べ替え順序は ベクター データ型には適用されません。 - ベクターの一意性の概念がないため、一意の制約は適用されません。
- ベクトル内の値の範囲確認も適用されません。
-
- ベクトルは、比較、加算、減算、乗算、除算、連結、またはその他の数学、論理、複合代入演算子をサポートしていません。
- ベクター 列は、メモリ最適化テーブルでは使用できません。
インデックス
- B ツリー インデックスまたは列ストア インデックスは、 ベクター 列では使用できません。 ただし、vector 列は、インデックス定義に含まれる列として指定できます。
テーブル スキーマのメタデータ
- システム ストアド プロシージャ sp_describe_first_result_set から vector データ型は正しく返されません。 そのため、多くのデータ アクセス クライアントとドライバーには、varchar または nvarchar データ型が示されます。
台帳テーブル
- ストアド プロシージャ
sp_verify_database_ledger
は、データベースに ベクター 列を含むテーブルが含まれている場合にエラーを生成します。
ユーザー定義データ型
-
CREATE TYPE
を使用して vector 型のエイリアス型を作成することはできません。これは xml および json データ型の動作と同様です。
常に暗号化されています
- ベクター 型は、Always Encrypted 機能ではサポートされていません。
既知の問題
- データ マスクは現在、Azure portal で ベクター データを varbinary データ型として表示しています。