首页 > 解决方案 > 数组作为sql请求参数

问题描述

我像这样处理我的 SQL 查询(有效):

const sql = require("mssql/msnodesqlv8");
const conn = new sql.ConnectionPool({
    database: "MyDatabase",
    server: "localhost\\SQLEXPRESS",
    driver: "msnodesqlv8",
    options: {
        trustedConnection: true
    }
});

async function runSQLQuery(insertReq, query) {
    try {
        await conn.connect();
        var result = await insertReq.query(query);
        await conn.close();
        return result;
    } catch (ex) {
        console.log(ex);
        return undefined;
    } finally {
        if (conn.connected)
            conn.close();
    }
}

并创建这样的查询(也可以):

exports.getClientByID = async function (ID) {
    var insertReq = conn.request();
    insertReq.input("ID", sql.UniqueIdentifier, ID);
    const request = await runSQLQuery(insertReq, `SELECT TOP (1) * FROM ${ClientTabel} WHERE ID = @ID`);
    return request.recordset[0]
};

但现在我想像这样添加一个数组作为参数(这不起作用):

exports.getUsersWithProperty = async function (properties) {
    var insertReq = conn.request();
    insertReq.input("properties", sql.NVarChar, properties);
    const request = await runSQLQuery(insertReq, `SELECT * FROM ${ClientTabel} WHERE Property IN @properties`);
    return request.recordset;
};

但是有了这个我只得到一个

请求错误”“@properties”附近的错误语法。

我猜类型sql.NVarChar是错误的,但我不知道正确的类型是什么。这有什么解决办法?

标签: node.jssql-server

解决方案


好的,首先,您需要在值周围添加括号。

IN 子句是这样的:

WHERE somecolumn IN ('value1','value2','value3')

您还必须确保在完成@properties 字符串替换后,您最终会得到一个类似于上述子句的语句,并且引号和逗号位于正确的位置。

或者,如果 @properties 是像 Value1、Value2、Value3 等这样的字符串,您可以将其传递给 T-SQL 表值函数,该函数返回如下表:

WHERE somecolumn IN dbo.ExtractStringList(@StringList)

推荐阅读