使用node-mssql连接MSSQL时查询结果列顺序不符问题求助
解决node-mssql查询结果列顺序不一致的问题
这个问题其实和JavaScript对象的属性特性以及JSON.stringify的行为直接相关。当你从查询结果拿到recordset时,每一行数据都是一个JS对象——而对象的属性顺序在序列化(比如用JSON.stringify转换)时,并不总是和你SQL查询里的列顺序一致。尤其是当属性名是数字(比如你的1、2、3、4)时,部分JS引擎会自动把数字键按升序排列,直接打乱了你预期的列顺序。你用到的toTable()方法本质也是基于对象属性构建结构,自然也会受这个问题影响。
解决方案1:用数组形式返回行数据(推荐)
node-mssql的Request对象支持配置outputAsArray: true,开启后每一行数据会以数组形式返回,数组元素的顺序完全和你SQL查询中的列顺序对应,从根源上避免了对象属性顺序的问题。修改代码如下:
const sql = require("mssql"); var sqlconnectionpool = new sql.ConnectionPool(mydbconfig); sqlconnectionpool.connect().then(pool => { const myquery = "select 1 ,2 as 'two',3 ,4"; pool .request() .outputAsArray(true) // 开启数组形式返回 .query(myquery) .then(result => { // 此时result.recordset是数组的数组,顺序严格匹配查询列 console.log(JSON.stringify(result.recordset)); }) .then(res => { pool.close(); }); });
解决方案2:手动按预期顺序重构结果
如果需要保留对象形式,可以手动定义列的顺序,重新构建结果集来保证输出顺序符合预期:
const sql = require("mssql"); var sqlconnectionpool = new sql.ConnectionPool(mydbconfig); sqlconnectionpool.connect().then(pool => { const myquery = "select 1 ,2 as 'two',3 ,4"; // 提前定义好你预期的列顺序 const columnOrder = ["1", "two", "3", "4"]; pool .request() .query(myquery) .then(result => { const orderedRecords = result.recordset.map(row => { return columnOrder.reduce((acc, col) => { acc[col] = row[col]; return acc; }, {}); }); console.log(JSON.stringify(orderedRecords)); }) .then(res => { pool.close(); }); });
这两种方法都能解决列顺序混乱的问题,第一种方案更简洁高效,优先推荐使用。
内容的提问来源于stack exchange,提问作者Sriram
相关产品推荐
相关产品推荐

