使用snowflake-sdk查询Snowflake遇数值错误,求解决方案
问题解决:Snowflake Node.js驱动查询类型不匹配错误
问题原因
你的online_store_transaction_id字段在Snowflake中是字符串类型(从控制台查询需用单引号包裹ID才能成功的行为可验证)。当你用模板字符串直接插入数字${168141924}时,生成的SQL语句中该值是裸数字,与字段的字符串类型不匹配,因此触发"Numeric value"类型错误。
解决方法
方法1:模板字符串中包裹单引号
直接在模板字符串里给插入的数值添加单引号,将其转为字符串格式,和控制台的查询逻辑保持一致:
const orderId = 168141924; const sql = ` SELECT online_store_transaction_id AS order_number, updated_at_ts, progress, status, service_time, site_name FROM Test.deliverydb WHERE online_store_transaction_id = '${orderId}' `; connection.execute({ sqlText: sql, fetchAsString: ['Number'], complete: function (err, stmt, rows) { if (err) { console.error('执行失败:' + err.message); } else { if (!rows) { throw new Error("未找到数据"); } console.log('执行成功:' + stmt.getSqlText()); const data = rows[0] || {}; console.log({ data }); } } });
方法2:使用参数绑定(推荐,避免SQL注入)
Snowflake Node.js驱动支持参数绑定,这是更安全、规范的写法,同时自动处理类型匹配问题:
const orderId = 168141924; const sql = ` SELECT online_store_transaction_id AS order_number, updated_at_ts, progress, status, service_time, site_name FROM Test.deliverydb WHERE online_store_transaction_id = ? `; connection.execute({ sqlText: sql, binds: [orderId.toString()], // 转为字符串匹配字段类型 fetchAsString: ['Number'], complete: function (err, stmt, rows) { if (err) { console.error('执行失败:' + err.message); } else { if (!rows) { throw new Error("未找到数据"); } console.log('执行成功:' + stmt.getSqlText()); const data = rows[0] || {}; console.log({ data }); } } });
注意:如果
orderId本身是字符串类型,可以直接传入binds: [orderId],无需额外转换。
内容的提问来源于stack exchange,提问作者user12494839
相关产品推荐
相关产品推荐

