如何在 Tedious 中 运行 一个 sql 查询为运算符中的 sql 提供多个值?
How to run a sql query in Tedious supplying multiple values for the sql in operator?
如果我只提供一个参数,下面的代码就可以工作。如果我从下拉列表中选择 select 德国和墨西哥,尽管 table
中存在数据,但查询不会返回任何内容
前端代码。通过 AJAX jQuery .post
发送参数
$('select').selectpicker();
var field1 = $('#field1').val();
$.post('data.js', {
field1: field1
})
app.js服务器端:
app.post('/data.js', function(req, res) {
var thequery1 = `SELECT top 10 country
,[ Sales] sales
,[Units Sold] as sold
,FORMAT( Date, 'dd/MM/yyyy', 'en-US' ) thedate
FROM easternsun.dbo.financial
where 1 = 1`
if (req.body.field1) {
thequery1 = thequery1 + ' and country in (@field1)'
}
});
Promise.all([queryTablewithPararams(thequery1, req.body.field1)])
.then(
data => res.json(data)
);
function queryTablewithPararams(thequery1, field1) {
return new Promise(function(resolve, reject) {
var con = new msSqlConnecter.msSqlConnecter(config);
con.connect().then(function() {
new con.Request(thequery1)
.addParam("field1", TYPES.VarChar, field1 )
.onComplate(function(count, datas) {
resolve(datas);
}).onError(function(err) {
console.log(err);
}).Run();
}).catch(function(ex) {
console.log(ex);
});
});
}
我的 HTML 下拉菜单代码:
<select id="field1" class="selectpicker form-control" multiple >
<option value="Canada">Canada</option>
<option value="Germany">Germany</option>
<option value="France">France</option>
<option value="Mexico">Mexico</option>
</select>
我确信我需要在此行中添加一些内容,但我不知道是什么。
.addParam("field1", TYPES.VarChar, field1 )
如果您 select 多个值,req.body.field1 将是一个数组,因此我们需要稍微更改一下代码。我们将创建一个输入参数数组 fields,然后将其传递给我们的查询函数。 where in 子句应该可以正常工作:
我们还需要更改查询函数以接受可变数量的参数。
我认为您根本不需要更改客户端代码。
app.post('/data.js', function(req, res) {
var thequery1 = `SELECT top 10 country
,[Sales] sales
,[Units Sold] as sold
,FORMAT( Date, 'dd/MM/yyyy', 'en-US' ) thedate
FROM easternsun.dbo.financial
where 1 = 1`
// Create an array containing all input parameters
let fields = [];
if (req.body.field1) {
fields = Array.isArray(req.body.field1) ? req.body.field1: [req.body.field1];
const fieldSql = fields.map((v,index) => `@field${index}`).join(",")
thequery1 = thequery1 + ` and country in (${fieldSql})`
}
Promise.all([queryTablewithPararams(thequery1, ...fields)])
.then(data => res.json(data));
});
// We need to change this function to accept multiple parameters.
function queryTablewithPararams(thequery1, ...params) {
return new Promise(function(resolve, reject) {
var con = new msSqlConnecter.msSqlConnecter(config);
con.connect().then(function() {
let request = new con.Request(thequery1);
// Add all the parameters
for(let [index, param] of Object.entries(params)) {
request = request.addParam(`field${index}`, TYPES.VarChar, param);
}
request.onComplate(function(count, datas) {
resolve(datas);
}).onError(function(err) {
console.log(err);
reject(err);
}).Run();
}).catch(function(ex) {
console.log(ex);
});
});
}
此语法简单得多,并且允许对多个列进行过滤。大表上的性能可能不会很好。
thequery1 = thequery1 + ' and country in (SELECT value FROM STRING_SPLIT(@field1,\',\')) '
.addParam("field1", TYPES.VarChar, field1)
如果我只提供一个参数,下面的代码就可以工作。如果我从下拉列表中选择 select 德国和墨西哥,尽管 table
中存在数据,但查询不会返回任何内容前端代码。通过 AJAX jQuery .post
发送参数$('select').selectpicker();
var field1 = $('#field1').val();
$.post('data.js', {
field1: field1
})
app.js服务器端:
app.post('/data.js', function(req, res) {
var thequery1 = `SELECT top 10 country
,[ Sales] sales
,[Units Sold] as sold
,FORMAT( Date, 'dd/MM/yyyy', 'en-US' ) thedate
FROM easternsun.dbo.financial
where 1 = 1`
if (req.body.field1) {
thequery1 = thequery1 + ' and country in (@field1)'
}
});
Promise.all([queryTablewithPararams(thequery1, req.body.field1)])
.then(
data => res.json(data)
);
function queryTablewithPararams(thequery1, field1) {
return new Promise(function(resolve, reject) {
var con = new msSqlConnecter.msSqlConnecter(config);
con.connect().then(function() {
new con.Request(thequery1)
.addParam("field1", TYPES.VarChar, field1 )
.onComplate(function(count, datas) {
resolve(datas);
}).onError(function(err) {
console.log(err);
}).Run();
}).catch(function(ex) {
console.log(ex);
});
});
}
我的 HTML 下拉菜单代码:
<select id="field1" class="selectpicker form-control" multiple >
<option value="Canada">Canada</option>
<option value="Germany">Germany</option>
<option value="France">France</option>
<option value="Mexico">Mexico</option>
</select>
我确信我需要在此行中添加一些内容,但我不知道是什么。
.addParam("field1", TYPES.VarChar, field1 )
如果您 select 多个值,req.body.field1 将是一个数组,因此我们需要稍微更改一下代码。我们将创建一个输入参数数组 fields,然后将其传递给我们的查询函数。 where in 子句应该可以正常工作:
我们还需要更改查询函数以接受可变数量的参数。
我认为您根本不需要更改客户端代码。
app.post('/data.js', function(req, res) {
var thequery1 = `SELECT top 10 country
,[Sales] sales
,[Units Sold] as sold
,FORMAT( Date, 'dd/MM/yyyy', 'en-US' ) thedate
FROM easternsun.dbo.financial
where 1 = 1`
// Create an array containing all input parameters
let fields = [];
if (req.body.field1) {
fields = Array.isArray(req.body.field1) ? req.body.field1: [req.body.field1];
const fieldSql = fields.map((v,index) => `@field${index}`).join(",")
thequery1 = thequery1 + ` and country in (${fieldSql})`
}
Promise.all([queryTablewithPararams(thequery1, ...fields)])
.then(data => res.json(data));
});
// We need to change this function to accept multiple parameters.
function queryTablewithPararams(thequery1, ...params) {
return new Promise(function(resolve, reject) {
var con = new msSqlConnecter.msSqlConnecter(config);
con.connect().then(function() {
let request = new con.Request(thequery1);
// Add all the parameters
for(let [index, param] of Object.entries(params)) {
request = request.addParam(`field${index}`, TYPES.VarChar, param);
}
request.onComplate(function(count, datas) {
resolve(datas);
}).onError(function(err) {
console.log(err);
reject(err);
}).Run();
}).catch(function(ex) {
console.log(ex);
});
});
}
此语法简单得多,并且允许对多个列进行过滤。大表上的性能可能不会很好。
thequery1 = thequery1 + ' and country in (SELECT value FROM STRING_SPLIT(@field1,\',\')) '
.addParam("field1", TYPES.VarChar, field1)