我正在使用nodejs npm软件包,sql 我目前有一系列产品skus,例如..
sql
var skus = ['product1', 'product2', 'product3'];
我的sql存储在文件中,如下所示…
SELECT * FROM stock AS s WHERE s.sku IN (@skus)
然后,我还准备了如下语句:
var connection = new sql.Connection(config, function(err) { var ps = new sql.PreparedStatement(connection); //Add params if(params != undefined){ for(var key in params){ ps.input(key, sql.VarChar(200)); } } ps.prepare(sqlstatement, function(err) { ps.execute(params, function(err, data) { callback(null, data); ps.unprepare(function(err) { }); }); }); }); }
skus正确地包含在params对象中,因为当我简单地使用它时,该语句可以正常工作,我WHERE X = @Y只是在努力如何传递数组skus以使它们在准备好的语句中工作。
skus
params
WHERE X = @Y
我使用split和修改字符串,join以逗号分隔等,但我无法使这些方法正常工作。
split
join
我以为我需要param字符串才能如下所示'product1','product2','product3'。
'product1','product2','product3'
如果有人可以阐明如何调试已完成的准备好的语句,这也很有用,这样我就可以看到实际查询到SQL的内容(使用参数)
提前谢谢了!
看来sql对象(即mssql模块)没有属性来处理任何数组。而且,ps.input类似地在调用中指定标量类型也不起作用。
mssql
ps.input
第二件事是将参数数组的键构建到sql语句本身中:
var connection = new sql.Connection(config, function(err) { var ps = new sql.PreparedStatement(connection); // Construct an object of parameters, using arbitrary keys var paramsObj = params.reduce((obj, val, idx) => { obj[`id${idx}`] = val; ps.input(`id${idx}`, sql.VarChar(200)); return obj; }, {}); // Manually insert the params' arbitrary keys into the statement var stmt = 'select * from table where id in (' + Object.keys(paramsObj).map((o) => {return '@'+o}).join(',') + ')'; ps.prepare(stmt, function(err) { ps.execute(paramsObj, function(err, data) { callback(null, data); ps.unprepare(function(err) { }); }); }); }); }