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 UNCOMMITTEDREAD COMMITTEDREPEATABLE READSERIALIZABLESNAPSHOT
(默认:
READ COMMITTED) -
options.connectionIsolationLevel- 新连接的默认隔离级别。所有事务外的查询都将使用此设置执行。请参阅 已知问题 > 连接池不重置隔离级别。READ UNCOMMITTEDREAD COMMITTEDREPEATABLE READSERIALIZABLESNAPSHOT
(默认:
READ COMMITTED) -
options.readOnlyIntent- 布尔值,决定连接是否向 SQL Server 可用性组请求只读访问权限。详情请见此处。(默认:false)。 -
options.encrypt- 布尔值,决定连接是否加密。若在 Windows Azure 上,应设置为 true。(默认:true)。 -
options.cryptoCredentialsDetails- 使用加密时,可提供的对象,将作为调用 tls.createSecurePair 的第一个参数。(默认:{})。 -
options.rowCollectionOnDone- 布尔值,若为 true,将在请求的done*事件中暴露接收到的行。参见 done,doneInProc和doneProc。(默认:false)注意:若接收到大量行,启用此选项可能导致占用过多内存。
-
options.rowCollectionOnRequestCompletion- 布尔值,若为 true,将在请求完成回调中暴露接收到的行。见new Request。(默认:false)注意:若接收到大量行,启用此选项可能导致占用过多内存。
-
options.tdsVersion- 使用的 TDS 版本。如果服务器不支持指定版本,将使用协商后的版本。版本由require('tedious').TDS_VERSION提供:7_17_27_3_A7_3_B7_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 类型支持不可用,因为该功能仍处于预览状态。详情见微软文档:Vector data type。
用法
@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选项指定向量维度
已知问题
连接池不重置隔离级别
当底层 node-mssql 驱动首次创建连接时,options.isolationLevel 和 options.connectionIsolationLevel 数据源选项会被正确应用。然而,node-mssql 在将连接归还到连接池时不会调用 connection.reset()。这意味着如果任何操作更改了池化连接上的隔离级别(例如,在不同级别上显式开启事务),该更改将会保留并泄漏给该连接的下一个使用者。
实际上,这使得 options.isolationLevel 和 options.connectionIsolationLevel 对于同时使用每事务隔离级别的应用程序来说并不可靠。
每事务隔离级别不受影响。 通过 startTransaction() 或 transaction() 回调设置隔离级别始终能正常工作,因为它是显式应用于活动连接的。
这是一个上游限制,已在 tediousjs/node-mssql#1483 中跟踪。