'@input_parameter' 附近的节点 MSSQL 语法不正确
Node MSSQL incorrect syntax near '@input_parameter'
我已经被这个错误卡住了大约一天了
我正在使用 node.js 和 html 表单,其中输入类型=复选框,我希望 mssql 使用表单发布的数据来查询
比方说
postData = [ '1','2','3','4','5' ]
JS代码:
var cfg = {
user: 'user',
password: '1234',
server: 'COMPUTERNAME\SQLEXPRESS',
port: '1433',
database: 'test',
pool: {
max: 20,
min: 0,
idleTimeoutMillis: 30000
}
};
app.post('/select', urlencodedParser, function (req, res){
var in_dt = String();
for (var i = 0; i < req.body.postData.length; i++) {
if (i==0) {
in_dt += ("('" + req.body.postData[i] + "'")
}else if (i==((req.body.postData.length)-1)) {
in_dt += (", '" + req.body.postData[i] + "')")
}else {
in_dt += (", '" + req.body.postData[i] + "'")
}
};
sql.connect(cfg).then(pool => {
return pool.request()
.input('input_parameter', sql.NVarChar, in_dt)
.query('SELECT * FROM [test].[dbo].[Table1] where ID IN @input_parameter')
}).then(result => {
res.render('select', { qDt: result.recordset });
sql.close()
}).catch(err => {
console.log(err);
})
sql.on('error', err => {
console.log(err);
})
});
它给了我
Incorrect syntax near '@input_parameter'
code: 'EREQUEST'
state: 1
class: 15
但是当我在 SSMS 中将查询和数据复制到 运行 时没问题
你能帮我找到错误所在并修复它吗?
我认为它不会像这样工作,您将不得不使用 sp_executesql。
创建 sql 如下:
let sql = 'SELECT * FROM [test].[dbo].[Table1] where ID IN (@input_parameter)';
将此 sql 作为输入参数传递。
在查询中,将查询放在下方(将 ID、标题替换为您想要的列)。
然后使用 sp_executesql 作为 :
create table #tempLookup(ID int , Title nvarchar(MAX));
insert into #tempLookup
exec sp_executesql @sql, N'@input_parameter VARCHAR(MAX)', @input_parameter;
select ID,Title from #tempLookup;
IF OBJECT_ID('tempdb..#tempLookup') IS NOT NULL
DROP TABLE #tempLookup
您需要删除 ' 字符
例如)in_dt = (1,5,6,4,1)
可以
in_dt = ('1','5','6','4','1')
不行
var in_dt = String();
for (var i = 0; i < req.body.postData.length; i++) {
if (i==0) {
in_dt += ("(" + req.body.postData[i] + "")
}else if (i==((req.body.postData.length)-1)) {
in_dt += (", " + req.body.postData[i] + ")")
}else {
in_dt += (", " + req.body.postData[i] + "")
}
};
希望对你有所帮助
我已经被这个错误卡住了大约一天了
我正在使用 node.js 和 html 表单,其中输入类型=复选框,我希望 mssql 使用表单发布的数据来查询
比方说
postData = [ '1','2','3','4','5' ]
JS代码:
var cfg = {
user: 'user',
password: '1234',
server: 'COMPUTERNAME\SQLEXPRESS',
port: '1433',
database: 'test',
pool: {
max: 20,
min: 0,
idleTimeoutMillis: 30000
}
};
app.post('/select', urlencodedParser, function (req, res){
var in_dt = String();
for (var i = 0; i < req.body.postData.length; i++) {
if (i==0) {
in_dt += ("('" + req.body.postData[i] + "'")
}else if (i==((req.body.postData.length)-1)) {
in_dt += (", '" + req.body.postData[i] + "')")
}else {
in_dt += (", '" + req.body.postData[i] + "'")
}
};
sql.connect(cfg).then(pool => {
return pool.request()
.input('input_parameter', sql.NVarChar, in_dt)
.query('SELECT * FROM [test].[dbo].[Table1] where ID IN @input_parameter')
}).then(result => {
res.render('select', { qDt: result.recordset });
sql.close()
}).catch(err => {
console.log(err);
})
sql.on('error', err => {
console.log(err);
})
});
它给了我
Incorrect syntax near '@input_parameter'
code: 'EREQUEST'
state: 1
class: 15
但是当我在 SSMS 中将查询和数据复制到 运行 时没问题
你能帮我找到错误所在并修复它吗?
我认为它不会像这样工作,您将不得不使用 sp_executesql。
创建 sql 如下:
let sql = 'SELECT * FROM [test].[dbo].[Table1] where ID IN (@input_parameter)';
将此 sql 作为输入参数传递。
在查询中,将查询放在下方(将 ID、标题替换为您想要的列)。
然后使用 sp_executesql 作为 :
create table #tempLookup(ID int , Title nvarchar(MAX));
insert into #tempLookup
exec sp_executesql @sql, N'@input_parameter VARCHAR(MAX)', @input_parameter;
select ID,Title from #tempLookup;
IF OBJECT_ID('tempdb..#tempLookup') IS NOT NULL
DROP TABLE #tempLookup
您需要删除 ' 字符
例如)in_dt = (1,5,6,4,1)
可以
in_dt = ('1','5','6','4','1')
不行
var in_dt = String();
for (var i = 0; i < req.body.postData.length; i++) {
if (i==0) {
in_dt += ("(" + req.body.postData[i] + "")
}else if (i==((req.body.postData.length)-1)) {
in_dt += (", " + req.body.postData[i] + ")")
}else {
in_dt += (", " + req.body.postData[i] + "")
}
};
希望对你有所帮助