TediousJS使用newBulkLoad方法时报连接未设置排序规则错误如何解决
该报错本质是TediousJS与SQL Server建立当前连接时,未成功获取到服务端返回的排序规则(collation)配置。由于newBulkLoad批量插入操作要求所有字符类型字段必须有明确的排序规则,来处理字符编码、排序比较等逻辑,当你传入空值给字符类型字段时,Tedious无法匹配到对应的排序规则标记,就会触发该异常。你代码中直接传递TYPES.Null作为值的写法,也会放大该问题的出现概率。
方案1:创建连接时全局显式指定排序规则
初始化Connection实例时,在配置项的options中添加collation字段,值填写你的SQL Server实例实际使用的排序规则即可,中文环境常用Chinese_PRC_CI_AS,英文环境常用SQL_Latin1_General_CP1_CI_AS。
代码示例:const { Connection } = require('tedious'); const connection = new Connection({ server: '数据库服务地址', authentication: { type: 'default', options: { userName: '数据库账号', password: '数据库密码' } }, options: { collation: 'Chinese_PRC_CI_AS', // 新增该行配置 database: '目标数据库名', trustServerCertificate: true } });方案2:给BulkLoad的字符类型列单独指定排序规则
如果不想修改全局连接配置,可以在定义批量插入的列时,单独给所有字符类型(VarChar/NVarChar/Char等)的列添加collation属性,仅对当前批量插入任务生效。
代码示例:const bulkLoad = connection.newBulkLoad('目标表名', (err, count) => { // 批量插入结果回调逻辑 }); // 定义列时指定排序规则 bulkLoad.addColumn('字段1', TYPES.NVarChar, { length: 100, nullable: true, collation: 'Chinese_PRC_CI_AS' // 新增该行配置 });方案3:替换
TYPES.Null为JS原生null值
你代码中传入的TYPES.Null是类型标记,并非实际空值,Tedious解析该标记时无法关联到对应列的排序规则配置,直接替换为JS原生null即可,修改后的行插入代码:bulkLoad.addRow(null, col2, col3, col4, col5, null, col7, col8, col9, null, null, null);方案4:确保连接建立完成后再执行批量插入逻辑
若在connection.connect的回调触发前就初始化BulkLoad、添加行,连接还未完成和服务端的协商获取排序规则,也会触发该报错。将所有批量插入相关逻辑放到连接建立成功的回调中执行即可。
内容的提问来源于stack exchange,提问作者d3vcho

