Как запустить SQL-запрос в Tedious, предоставляя несколько значений для оператора SQL в? - PullRequest
0 голосов
/ 06 ноября 2019

Код ниже работает, если я предоставляю только один параметр. Если я выберу Германию и Мексику из раскрывающегося списка, по запросу ничего не будет возвращено, несмотря на данные, имеющиеся в таблице

Код внешнего интерфейса. Отправка параметров через 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>

IЯ уверен, что мне нужно что-то добавить в эту строку, но я не знаю, что.

.addParam("field1", TYPES.VarChar, field1 )

Ответы [ 2 ]

1 голос
/ 09 ноября 2019

Этот синтаксис значительно проще и позволяет фильтровать более одного столбца. Производительность на больших столах, вероятно, будет невелика.

thequery1 = thequery1 + ' and country in (SELECT value FROM STRING_SPLIT(@field1,\',\')) '



.addParam("field1", TYPES.VarChar, field1)
1 голос
/ 06 ноября 2019

Если вы выберете несколько значений, req.body.field1 будет массивом, поэтому нам нужно немного изменить код. Мы создадим массив входных параметров, fields , а затем передадим его в нашу функцию запроса. Предложение где в должно работать правильно:

Нам также нужно изменить функцию запроса, чтобы она принимала переменное число параметров.

Не думаю, что вам нужноизменить свой код на стороне клиента вообще.

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);
        });
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...