VECTOR_SEARCH(Transact-SQL) (预览版)

适用于:SQL Server 2025 (17.x) 预览版

使用近似相邻向量搜索算法搜索类似于给定查询矢量的矢量。 若要详细了解矢量索引和矢量搜索的工作原理,以及精确搜索和近似搜索之间的差异,请参阅 SQL 数据库引擎中的矢量搜索和矢量索引

预览功能

此函数处于预览状态,可能会更改。 若要使用此功能,必须启用 PREVIEW_FEATURES数据库范围的配置

在使用之前,请确保先查看 当前限制

Syntax

Transact-SQL 语法约定

VECTOR_SEARCH(
    TABLE = object [ AS source_table_alias ]
    , COLUMN = vector_column
    , SIMILAR_TO = query_vector
    , METRIC = { 'cosine' | 'dot' | 'euclidean' }
    , TOP_N = k
) [ AS result_table_alias ]

Arguments

TABLE = 对象 [AS source_table_alias]

执行搜索的表。 它必须是基表。 不支持视图、临时表(本地表和全局表)。

COLUMN = vector_column

在其中执行搜索的向量列。 该列必须是 矢量 数据类型。

SIMILAR_TO = query_vector

用于搜索的向量。 它必须是 矢量 类型的变量或列。

METRIC = { 'cosine' |'dot' |'euclidean' }

用于计算查询向量与指定列中矢量之间的距离的距离指标。 仅当找到与同一个指标和同一列匹配的 ANN 索引时,才使用 ANN(近似近邻)索引。 如果没有兼容的 ANN 索引,则会引发警告,并使用 KNN (k-Nearest Neighbor) 算法。

TOP_N = <k>

必须返回的最大相似向量数。 它必须是正 整数

result_table_alias

别名用于引用结果集。

返回结果集

函数返回 VECTOR_SEARCH 的结果集包括:

  • 参数中指定的 TABLE 表中的所有列。
  • 一个名为 distance的另一列,表示参数指定的 COLUMN 列中向量与参数中 SIMILAR_TO 提供的向量之间的距离。

距离列由 VECTOR_SEARCH 函数本身生成,而所有其他列都来自参数中引用的 TABLE 表。

如果使用参数中表的 TABLE 别名,则必须使用相同的别名来引用语句中的 SELECT 列。 不能使用分配给 VECTOR_SEARCH 引用表中指定 TABLE列的别名。 如果认为通过获取表数据的输出 VECTOR_SEARCH 并合并结果集,可以更轻松地理解此行为。

如果参数中指定的 TABLE 表已包含一 distance个名为列,该行为将类似于两个共享列名称的表之间的 SQL 联接。 在这种情况下,必须使用表别名来消除列引用的歧义,否则将引发错误。

Limitations

当前预览版具有以下限制:

仅筛选后

矢量搜索在应用任何谓词之前发生。 仅当返回最相似的向量后,才会应用其他谓词。 下面的示例返回与查询向量 @qv最相似的嵌入的前 10 行,然后应用子句中指定的 WHERE 谓词。 如果与矢量搜索返回的向量关联的 10 行中没有等于 accepted 1 的列,则结果为空。

SELECT TOP (10) s.id,
                s.title,
                r.distance
FROM VECTOR_SEARCH(
         TABLE = dbo.sessions AS s,
         COLUMN = embedding,
         SIMILAR_TO = @qv,
         METRIC = 'cosine',
         TOP_N = 10
     ) AS r
WHERE accepted = 1
ORDER BY r.distance;

无法在视图中使用VECTOR_SEARCH

VECTOR_SEARCH 不能在视图正文中使用。

Examples

示例 1

以下示例查找表中最相似的 10 篇文章Pink Floyd music stylewikipedia_articles_embeddings

DECLARE @qv VECTOR(1536) = AI_GENERATE_EMBEDDING(N'Pink Floyd music style' USE MODEL Ada2Embeddings);
SELECT TOP (10) s.id,
                s.title,
                r.distance
FROM VECTOR_SEARCH(
        TABLE = [dbo].[wikipedia_articles_embeddings] as t,
        COLUMN = [content_vector],
        SIMILAR_TO = @qv,
        METRIC = 'cosine',
        TOP_N = 10
    ) AS s
ORDER BY s.distance

示例 2

与示例 1 相同,但这次查询向量是从另一个表而不是变量中获取的。

CREATE TABLE #t
(
    id INT,
    q NVARCHAR (MAX),
    v VECTOR(1536)
);

INSERT INTO #t
SELECT id,
       q,
       AI_GENERATE_EMBEDDINGS(q USE MODEL Ada2Embeddings)
FROM (VALUES
        (1, N'four legged furry animal'),
        (2, N'pink floyd music style')
    ) S(id, q);

SELECT TOP (10) t.id,
                s.distance,
                t.title
FROM #t AS qv
CROSS APPLY
    VECTOR_SEARCH(
        TABLE = [dbo].[wikipedia_articles_embeddings] AS t,
        COLUMN = [content_vector],
        SIMILAR_TO = qv.v,
        METRIC = 'cosine',
        TOP_N = 10
    ) AS s
WHERE qv.id = 2
ORDER BY s.distance;

示例 3

使用和相关CREATE VECTOR INDEX函数的基本端到端示例VECTOR_SEARCH。 将模拟嵌入内容。 在实际方案中,嵌入使用嵌入模型和 AI_GENERATE_EMBEDDINGSOpenAI SDK 等外部库生成。

以下代码块演示 VECTOR_SEARCH 了具有模拟嵌入的函数:

  1. 启用当前预览版中必需的跟踪标志。
  2. 使用数据类型dbo.Articles的列embedding创建示例表
  3. 使用模拟嵌入数据插入示例数据。
  4. 在 . 上 dbo.Articles.embedding创建向量索引。
  5. 使用函数演示矢量相似性搜索 VECTOR_SEARCH
-- Step 0: Enable Preview Feature
ALTER DATABASE SCOPED CONFIGURATION
SET PREVIEW_FEATURES = ON;
GO

-- Step 1: Create a sample table with a VECTOR(5) column
CREATE TABLE dbo.Articles
(
    id INT PRIMARY KEY,
    title NVARCHAR(100),
    content NVARCHAR(MAX),
    embedding VECTOR(5) -- mocked embeddings
);
GO

-- Step 2: Insert sample data
INSERT INTO Articles (id, title, content, embedding)
VALUES
(1, 'Intro to AI', 'This article introduces AI concepts.', '[0.1, 0.2, 0.3, 0.4, 0.5]'),
(2, 'Deep Learning', 'Deep learning is a subset of ML.', '[0.2, 0.1, 0.4, 0.3, 0.6]'),
(3, 'Neural Networks', 'Neural networks are powerful models.', '[0.3, 0.3, 0.2, 0.5, 0.1]'),
(4, 'Machine Learning Basics', 'ML basics for beginners.', '[0.4, 0.5, 0.1, 0.2, 0.3]'),
(5, 'Advanced AI', 'Exploring advanced AI techniques.', '[0.5, 0.4, 0.6, 0.1, 0.2]');
GO

-- Step 3: Create a vector index on the embedding column
CREATE VECTOR INDEX vec_idx ON Articles(embedding)
WITH (METRIC = 'cosine', TYPE = 'diskann');
GO

-- Step 4: Perform a vector similarity search
DECLARE @qv VECTOR(5) = '[0.3, 0.3, 0.3, 0.3, 0.3]';
SELECT TOP(3)
    t.id,
    t.title,
    t.content,
    s.distance
FROM
    VECTOR_SEARCH(
        TABLE = Articles AS t,
        COLUMN = embedding,
        SIMILAR_TO = @qv,
        METRIC = 'cosine',
        TOP_N = 3
    ) AS s
ORDER BY s.distance, t.title;