You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 01:17:34