跳到主要内容

Microsoft SQLServer

安装

npm install mssql

数据源选项

有关通用数据源选项,请参见数据源选项

基于 tedious 的 MSSQL 实现。有关公开属性的详细信息,请参见 SqlServerConnectionOptions.ts

  • url - 用于连接的连接 URL。请注意,其他数据源选项将覆盖从 URL 设置的参数。

  • host - 数据库主机。

  • port - 数据库主机端口。默认的 mssql 端口是 1433

  • username - 数据库用户名。

  • password - 数据库密码。

  • database - 数据库名称。

  • schema - 模式名称。默认为 "dbo"。

  • domain - 设置域后,驱动程序将使用域登录连接到 SQL Server。

  • connectionTimeout - 连接超时时间(毫秒)(默认:15000)。

  • requestTimeout - 请求超时时间(毫秒)(默认:15000)。注意:msnodesqlv8 驱动程序不支持低于 1 秒的超时时间。

  • stream - 以流的方式返回记录集/行,而不是一次性通过回调参数返回(默认:false)。你也可以为每个请求单独启用流(request.stream = true)。如果计划处理大量行,请始终将其设置为 true

  • pool.max - 连接池中的最大连接数(默认:10)。

  • pool.min - 连接池中的最小连接数(默认:0)。

  • pool.maxWaitingClients - 允许排队的最大请求数。超过此数量的 acquire 调用将在事件循环的后续周期中通过错误回调返回。

  • pool.acquireTimeoutMillis - acquire 调用等待资源的最长时间(毫秒)。超时后将放弃等待(默认:无限制)。如果指定,必须是非零正整数。

  • pool.fifo - 如果为 true,则优先分配最早释放的资源;如果为 false,则优先分配最近释放的资源。这实际上会将连接池的行为从队列变为栈。布尔类型,默认值为 true

  • pool.priorityRange - 介于 1 和 x 之间的整数。如果设置,借用者在没有可用资源时可以指定其在队列中的相对优先级。参见示例。(默认:1)。

  • pool.evictionRunIntervalMillis - 运行驱逐检查的时间间隔。默认:0(不运行)。

  • pool.numTestsPerRun - 每次驱逐运行检查的资源数量。默认:3

  • pool.softIdleTimeoutMillis - 对象在池中空闲多长时间后可由空闲对象驱逐器(如果有)驱逐,但会保留至少“最小空闲”数量的对象实例。默认:-1(不驱逐任何对象)。

  • pool.idleTimeoutMillis - 对象在池中空闲达到多长时间后可因空闲超时被驱逐,该值会覆盖 softIdleTimeoutMillis。默认:30000

  • pool.errorHandler - 当底层连接池发出 'error' 事件时调用的函数。接收一个参数(错误实例),默认以 warn 级别记录。

  • options.fallbackToDefaultDb - 默认情况下,如果无法访问 options.database 请求的数据库,连接将失败并报错。如果设置为 true,则使用用户的默认数据库代替(默认:false)。

  • options.instanceName - 要连接的实例名称。数据库服务器上必须运行 SQL Server 浏览器服务,并且数据库服务器的 UDP 端口 1434 必须可访问。与 port 互斥。(无默认值)。

  • options.enableAnsiNullDefault - 如果为 true,将在初始 SQL 中设置 SET ANSI_NULL_DFLT_ON ON,这意味着新列默认允许为空。详见 T-SQL 文档(默认:true)。

  • options.cancelTimeout - 请求取消(中止)被视为失败之前的等待时间(毫秒)(默认:5000)。

  • options.packetSize - TDS 数据包的大小(与服务器协商)。应为 2 的幂。(默认:4096)。

  • options.useUTC - 布尔值,决定是否以 UTC 时间而非本地时间传输时间值。(默认:false)。

  • options.abortTransactionOnError - 布尔值,决定在事务执行过程中遇到任何错误时是否自动回滚事务。该选项设置连接初始 SQL 阶段中 SET XACT_ABORT 的值(文档)。

  • options.localAddress - 连接 SQL Server 时使用的网络接口(IP 地址)。

  • options.useColumnNames - 布尔值,决定返回的行是数组还是键值集合。(默认:false)。

  • options.camelCaseColumns - 布尔值,控制返回的列名首字母是否转换为小写(true)。如果提供了 columnNameReplacer,则忽略该值。(默认:false)。

  • options.isolationLevel - 事务的默认隔离级别。隔离级别由 require('tedious').ISOLATION_LEVEL 提供:

  • options.isolationLevel - 事务运行时的默认隔离级别。请参阅 已知问题 > 连接池不重置隔离级别

    • READ UNCOMMITTED
    • READ COMMITTED
    • REPEATABLE READ
    • SERIALIZABLE
    • SNAPSHOT

    (默认:READ COMMITTED

  • options.connectionIsolationLevel - 新连接的默认隔离级别。所有事务外的查询都将使用此设置执行。请参阅 已知问题 > 连接池不重置隔离级别

    • READ UNCOMMITTED
    • READ COMMITTED
    • REPEATABLE READ
    • SERIALIZABLE
    • SNAPSHOT

    (默认:READ COMMITTED

  • options.readOnlyIntent - 布尔值,决定连接是否向 SQL Server 可用性组请求只读访问权限。详情请见此处。(默认:false)。

  • options.encrypt - 布尔值,决定连接是否加密。在 Windows Azure 上使用时,应设置为 true。(默认:true)。

  • options.cryptoCredentialsDetails - 使用加密时可提供的对象,将作为调用 tls.createSecurePair 时的第一个参数。(默认:{})。

  • options.rowCollectionOnDone - 布尔值。如果为 true,将在请求的 done* 事件中公开接收到的行。参见 done、doneInProcdoneProc。(默认:false

    注意:如果接收到大量行,启用此选项可能会占用过多内存。

  • options.rowCollectionOnRequestCompletion - 布尔值。如果为 true,将在请求完成回调中公开接收到的行。参见 new Request。(默认:false

    注意:如果接收到大量行,启用此选项可能会占用过多内存。

  • options.tdsVersion - 使用的 TDS 版本。如果服务器不支持指定版本,将使用协商后的版本。版本由 require('tedious').TDS_VERSION 提供:

    • 7_1
    • 7_2
    • 7_3_A
    • 7_3_B
    • 7_4

    (默认:7_4

  • options.appName - 用于在 SQL Server 的分析、日志或跟踪工具中标识特定应用的应用名称。(默认:node-mssql

  • options.trustServerCertificate - 布尔值,控制在没有可验证的服务器证书时是否进行加密。(默认:false)。

  • options.multiSubnetFailover - 布尔值,控制驱动程序是否应并行连接 DNS 返回的所有 IP。(默认:false)。

  • options.debug.packet - 布尔值,控制是否发出包含数据包详细信息文本的 debug 事件。(默认:false)。

  • options.debug.data - 布尔值,控制是否发出包含数据包数据详细信息文本的 debug 事件。(默认:false)。

  • options.debug.payload - 布尔值,控制是否发出包含数据包负载详细信息文本的 debug 事件。(默认:false)。

  • options.debug.token - 布尔值,控制是否发出包含令牌流令牌描述文本的 debug 事件。(默认:false)。

列类型

int, bigint, bit, decimal, money, numeric, smallint, smallmoney, tinyint, float, real, date, datetime2, datetime, datetimeoffset, smalldatetime, time, char, varchar, text, nchar, nvarchar, ntext, binary, image, varbinary, hierarchyid, sql_variant, timestamp, uniqueidentifier, xml, geometry, geography, rowversion, vector

向量类型(vector)

SQL Server 支持用来存储高维向量的 vector 数据类型,常用于:

  • 带嵌入的语义搜索
  • 推荐系统
  • 相似度匹配
  • 机器学习应用

注意:通用的 halfvec 类型支持不可用,因为该功能仍处于预览状态。详情见微软文档:向量数据类型

用法

@Entity()
export class DocumentChunk {
@PrimaryGeneratedColumn()
id: number

@Column("varchar")
content: string

// 向量列,维度为 1998
@Column("vector", { length: 1998 })
embedding: number[]
}

向量相似度搜索

SQL Server 提供了 VECTOR_DISTANCE 函数用于计算向量间距离:

const queryEmbedding = [/* 你的查询向量 */]

const results = await dataSource.query(
`
DECLARE @question AS VECTOR (1998) = @0;
SELECT TOP (10) dc.*,
VECTOR_DISTANCE('cosine', @question, embedding) AS distance
FROM document_chunk dc
ORDER BY VECTOR_DISTANCE('cosine', @question, embedding)
`,
[JSON.stringify(queryEmbedding)],
)

距离度量方式:

  • 'cosine' - 余弦距离(语义搜索中最常用)
  • 'euclidean' - 欧氏距离(L2)
  • 'dot' - 负点积

要求:

  • 启用向量支持的 SQL Server 版本
  • 必须使用 length 选项指定向量维度。

已知问题

连接池不重置隔离级别

特定于驱动程序的 options.isolationLeveloptions.connectionIsolationLevel 数据源选项在底层 node-mssql 驱动首次创建连接时会被正确应用。但是,当连接返回到连接池时,node-mssql 不会调用 connection.reset()。这意味着如果有任何操作在连接池连接上更改了隔离级别(例如,不同隔离级别下的显式事务),该更改会持续存在并泄露到该连接的下一个使用者。

实际上,这使得对于同时使用每事务隔离级别的应用程序而言,options.isolationLeveloptions.connectionIsolationLevel 并不可靠。

推荐替代方案: 使用顶层 isolationLevel DataSource 选项(所有驱动都可用)替代。它会在每个事务开始时显式应用隔离级别,从而完全绕过连接池限制。参见 Transactions > Default Isolation Level

这是一个上游限制,已在 tediousjs/node-mssql#1483 中跟踪。