TypeScript/JS查询SQL Server返回字符串而非数值类型的求助
解决方案
核心思路
利用查询结果返回的列类型元数据,遍历每条记录自动转换对应字段的值,无需修改原有查询语句。
步骤1:编写类型转换工具函数
定义SQL类型对应的转换逻辑,覆盖数值类型转换和日期格式化需求:
// SQL类型到转换函数的映射 const typeConverters = { // 转换BigInt类型 BigInt: (value: string) => BigInt(value), // 转换Int类型 Int: (value: string) => parseInt(value, 10), // 格式化日期为YYYY-MM-DD HH:mm:ss格式 DateTime: (value: string) => { const date = new Date(value); return `${date.getFullYear()}-${String(date.getMonth()+1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')} ${String(date.getHours()).padStart(2, '0')}:${String(date.getMinutes()).padStart(2, '0')}:${String(date.getSeconds()).padStart(2, '0')}`; }, // 可按需添加更多类型(如SmallInt、Decimal等) }; // 批量转换记录集的字段类型 function convertRecordsetTypes(recordset: any[], columns: any[]) { // 构建列名到类型的映射表 const columnTypeMap = columns.reduce((map, column) => { map[column.name] = column.type; return map; }, {} as Record<string, string>); // 遍历每条记录完成转换 return recordset.map(row => { const convertedRow: Record<string, any> = {}; for (const [key, value] of Object.entries(row)) { const converter = typeConverters[columnTypeMap[key]]; convertedRow[key] = converter ? converter(value) : value; } return convertedRow; }); }
步骤2:修改原查询函数,加入类型转换逻辑
在获取查询结果后,调用转换函数处理记录集:
async function SQLQuery(query: string, database: string) { try { const pool = await poolManager.get(database, dbconn[database]); const result = await pool.request().query(query); // 存在记录集和列元数据时执行转换 if (result.recordset && result.columns) { // 若调试发现列元数据在result.recordset.columns下,替换为result.recordset.columns result.recordset = convertRecordsetTypes(result.recordset, result.columns); } console.log("Result: ", result?.recordset); return result?.recordset; } catch (err) { console.log("Error during SQL query: \n" + err); } };
注意事项
- 类型名称匹配:不同版本的mssql库返回的类型名称可能存在大小写差异(比如
bigint而非BigInt),请根据实际调试结果调整typeConverters中的键名。 - 日期格式自定义:示例中日期格式为
YYYY-MM-DD HH:mm:ss,可根据需求替换为toLocaleString()或其他格式逻辑。 - 扩展类型支持:如需转换Decimal、Float等其他类型,直接在
typeConverters中添加对应转换函数即可。
内容的提问来源于stack exchange,提问作者user3317014
相关产品推荐
相关产品推荐

