我使用的是nodejs npm package sql
我目前有一系列产品skus像这样..
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
语句时,该语句正常工作我正在努力解决我需要传递{{1}数组的问题1}}允许他们在准备好的陈述中工作。
我使用skus
和split
修改字符串以逗号分隔等等,但我无法使这些方法起作用。
我认为我需要param字符串看起来像以下join
。
如果有人可以阐明如何调试已完成的预准备语句,那么我也可以看到实际被查询到SQL的内容(使用params inplace)
非常感谢提前!
答案 0 :(得分:4)
sql
对象(即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) {
});
});
});
});
}