NodeJS MSSQL WHERE IN 准备好的 SQL 语句

Mat*_*nja 4 javascript sql sql-server prepared-statement node.js

我正在使用 nodejs npm 包sql 我目前有一系列产品 skus 像这样..

var skus = ['product1', 'product2', 'product3'];
Run Code Online (Sandbox Code Playgroud)

我的 sql 存储在一个文件中,如下所示...

SELECT *
FROM stock AS s
WHERE s.sku IN (@skus)
Run Code Online (Sandbox Code Playgroud)

然后我还有我准备好的语句代码如下..

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) {
                });
            });
        });
    });
}
Run Code Online (Sandbox Code Playgroud)

skus在中正确包含params对象的声明时,我使用它的简单工作得很好WHERE X = @Y,我只是如何,我需要传递的阵列挣扎skus,让他们工作在准备好的声明。

我正在修改字符串split并使用join逗号分隔它们等,但我无法使这些方法起作用。

我假设我需要 param 字符串看起来像下面这样'product1','product2','product3'

如果有人可以阐明如何调试已完成的准备好的语句,这样我就可以看到实际向 SQL 查询的内容(使用参数就位),这也将很有用

提前谢谢了!

Jel*_*Cat 5

似乎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) {
                });
            });
        });
    });
}
Run Code Online (Sandbox Code Playgroud)