Knex + SQL 服务器 whereIn 查询 8-12s -- 原始版本 returns 没有结果但是如果我直接输入 .toQuery() 结果我得到结果

Knex + SQL Server whereIn query 8-12s -- raw version returns NO results but if I input the .toQuery() result directly I get results

数据库在 Azure 云中,目前未在生产中使用。有 80.000 行,uprn 是 VARCHAR(100);

我已经在使用 JOI 来验证每个 UPRN;

我将 KNEX 与 SQL 服务器数据库一起使用,其中包含以下 whereIn 查询:

knex(LOCATIONS.table).whereIn(LOCATIONS.uprn, req.body.uprns)

但这需要 8-12 秒才能完成,有时会超时。如果我在同一件事上使用 .toQuery(),SSMS 将 return 结果在 1-2 内。

如果我执行原始查询,生成的 .toQuery() 或 toString() 在 SSMS 和 returns 结果中有效。但是如果我尝试直接使用 raw,它将 return 0 个结果。

我正在寻求解决导致 whereIn 如此缓慢的原因或让原始查询正常工作。

编辑 1:

经过多次调试和尝试 -- 似乎错误是由于 knex 如何处理数组,所以我做了一个 for-of 循​​环来添加 ? ? ?对于每个数组元素,然后输入所有参数的数组。

这让我意识到性能问题是由于 SQL 服务器参数化方式造成的。

我最终构建了一个包含所有参数的原始查询字符串,并使用 Joi string/regex 配置验证了输入:

 Joi.string()
            .min(1)
            .max(35)
            .regex(/^[a-z\d\-_\s]+$/i)

只允许字母数字、破折号和空格,这会阻止 sql 注入。

我将更深入地研究这个安全问题,并且可能会进行单独的登录,该登录只能 SELECT 来自 table 的数据,仅此而已 运行查询。

只需要原始处理并单独验证。