Node mssql:SQL插入后返回id

时间:2017-10-04 12:59:06

标签: javascript sql-server node.js package

我正在开发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

2 个答案:

答案 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()示例,因为它会在明天插入日期...我需要解决这个问题。