我正试图在某种情况下查询表格:
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');
这也不起作用。
真的很感激一些帮助!
答案 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)
之类的东西为你处理这类事情。