NodeJS MSSQL WHERE IN准备好的SQL语句

时间:2015-10-28 12:16:04

标签: javascript sql sql-server node.js prepared-statement

我使用的是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) {
                });
            });
        });
    });
}

skusparams对象中正确包含,因为当我将它用于简单WHERE X = @Y语句时,该语句正常工作我正在努力解决我需要传递{{1}数组的问题1}}允许他们在准备好的陈述中工作。

我使用skussplit修改字符串以逗号分隔等等,但我无法使这些方法起作用。

我认为我需要param字符串看起来像以下join

如果有人可以阐明如何调试已完成的预准备语句,那么我也可以看到实际被查询到SQL的内容(使用params inplace)

非常感谢提前!

1 个答案:

答案 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) {
                });
            });
        });
    });
}