我正在开发Mongodb和SQL Server之间的集成,使用mssql
程序包通过预定的流程从MongoDb插入和更新寄存器到SQL Server数据库。
每次插入新寄存器时,我都希望检索新的行ID,因为我需要它来执行另一次子寄存器的插入。
我尝试了以下操作,期望在查询结果中检索到一些信息。该查询实际上插入了该行,但result
返回为undefined
:
var sql = require('mssql');
var connectionConfig = 'xxxxxxxxxxxx';
var insertionQuery = 'xxxxxxxxxxxx';
sql.connect(connectionConfig).then(pool => {
pool
.request()
.query(insertionQuery);
}).then(result => {
//I expect 'result' to have information of the inserted row, but it comes undefined instead
cosole.log(result);
}).catch(err => {
console.err(err);
});
我认为使用存储过程可能会解决此问题,但我只是想避免使用存储过程进行简单插入。
有人知道如何在插入后重新获得新行ID吗?
修改
我在我的SQL语句中包含OUTPUT SCOPE_IDENTITY()
- 我的查询现在看起来像:
INSERT INTO TABLE (columns...)
OUTPUT SCOPE_IDENTITY()
VALUES (values...)
如果我在SQL Server Management Studio中运行查询,它运行正常,我返回了新的行ID,但是当通过mssql
包的query
方法运行查询时,{{ 1}}像这样返回:
result
答案 0 :(得分:6)
我引用node-mssql insert returning undefined recordset:
INSERT
语句不返回记录集,因此recordset
是 未定义。有关详细信息,请参阅文档的this section 关于如何获得受影响的行数。
解决此问题的一个选项是在SELECT
之后添加INSERT
语句,并要求SCOPE_IDENTITY()
或@@IDENTITY
。这将获得最后插入的对象的ID,即:INSERT INTO table (...) VALUES (...); SELECT SCOPE_IDENTITY() AS id;
答案 1 :(得分:0)
如果有人遇到GUID问题,由于您无法将其设置为“身份”列,因此您必须执行以下操作:
const result = await pool
.request()
.input('orgName', sql.VarChar, orgName)
.input('tier', sql.Int, tier)
.input('status', sql.Int, status)
.input('createDate', sql.Date, new Date())
.input('statusChangeDate', sql.Date, new Date())
.query(`INSERT INTO app.Organizations (OrgName,
Tier, Status, CreateDate, StatusChangeDate)
OUTPUT inserted.OrgID
VALUES (@orgName, @tier, @status, @createDate, @statusChangeDate);
`)
其中orgID是自动生成的GUID。也不要遵循我的新Date()示例,因为它会在明天插入日期...我需要解决这个问题。