试图在Node.js mssql中的查询中传递参数

时间:2018-03-25 03:52:09

标签: sql-server node.js

我正试图在某种情况下查询表格:

  try {
    var pool = await sql.connect(config);
    var data = await sql.query`SELECT * FROM mytable WHERE ${types}`;
  } catch (err) {
    res.send(err);
  }

其中类型为“ContractType ='AllRisks'”

出于某种原因,它没有返回任何东西。当我把硬编码类型字符串直接放在sql.query中时,它实际上返回结果并起作用。

不太确定发生了什么。

我尝试另一种方式:

var result1 = await pool.request()
  .input('types', sql.VarChar(50), types)
  .query('SELECT * FROM dbo.denormalized WHERE @types');

这也不起作用。

真的很感激一些帮助!

1 个答案:

答案 0 :(得分:0)

第一

  

var data = await sql.query`SELECT * FROM mytable WHERE $ {types}`;

缺少括号,所以它实际上并没有调用.query,但为了安全起见,你真的应该做第二种方法(以防止sql注入)。

但第二种方式可能是错误 -

在发送预准备语句时,必须在没有给出@types文字的情况下解释/理解sql - 它认为它是一个参数。 select * from x where 'hello world'不是有效的sql,并且@types中的所有内容都被绑定为Varchar文字。

SELECT * FROM dbo.denormalized WHERE ContractType = @types

并使javascript types变量仅包含AllRisks。请注意,您不需要绕过AllRisks周围的引号,值" AllRisks"作为一个字符串应该是足够的;例如let types = 'AllRisks'。您已经告诉库您绑定了一个Varchar。

---编辑

由于你想做一个类型数组,我研究了使用mssql包做WHERE IN并提出了这个相关的问题 - NodeJS MSSQL WHERE IN Prepared SQL Statement

我会在此时直接使用mssql模块,并使用常见的http://knexjs.org/,并在底层使用mssql。它会用knex.select().from('table').whereIn('ContractTypes', types)之类的东西为你处理这类事情。