如何通过Azure Functions SQL扩展返回插入行的标识值
解决方案:返回Azure SQL插入行的标识ID
针对你的场景,有两种可靠的方式获取插入行的标识ID并返回给客户端:
方法1:修改SQL输出绑定,执行带返回的插入语句
默认的表名输出绑定(commandText设为表名)只会执行插入,但无法返回标识ID。你可以把commandText改成包含插入逻辑和返回标识的SQL语句,用SCOPE_IDENTITY()替代@@IDENTITY(前者仅返回当前会话当前作用域生成的标识,避免触发器等干扰)。
步骤:
- 更新
function.json中的输出绑定配置:
{ "name": "insertResult", "type": "sql", "direction": "out", "commandText": "INSERT INTO [dbo].[MYTABLE] (Col1, Col2) VALUES (@Col1, @Col2); SELECT SCOPE_IDENTITY() AS InsertedId;", "commandType": "Text", "connectionStringSetting": "YourConnectionStringSetting" }
- 在JavaScript函数代码中,将请求参数映射到SQL参数,并获取返回的标识ID:
module.exports = async function (context, req) { // 从请求体获取要插入的数据 const data = req.body; // 设置SQL参数 context.bindings.insertResult = { Col1: data.col1, Col2: data.col2 }; // 执行完成后,获取返回的结果 const insertedId = context.bindings.insertResult[0].InsertedId; // 返回给客户端 context.res = { status: 201, body: { insertedId: insertedId } }; };
方法2:直接在函数代码中执行SQL操作(更灵活)
如果需要更精细的控制,可以跳过SQL输出绑定,直接用mssql库在代码中执行插入并获取标识ID:
步骤:
- 安装
mssql依赖:
npm install mssql
- 在函数代码中编写逻辑:
const sql = require('mssql'); const config = { connectionString: process.env.YourConnectionStringSetting }; module.exports = async function (context, req) { try { await sql.connect(config); const result = await sql.query` INSERT INTO [dbo].[MYTABLE] (Col1, Col2) VALUES (${req.body.col1}, ${req.body.col2}); SELECT SCOPE_IDENTITY() AS InsertedId; `; const insertedId = result.recordset[0].InsertedId; context.res = { status: 201, body: { insertedId: insertedId } }; } catch (err) { context.res = { status: 500, body: err.message }; } finally { await sql.close(); } };
为什么之前的输入绑定方法无效?
输入绑定的执行时机是函数启动前,而你的插入操作是通过输出绑定在函数执行过程中完成的。当输入绑定查询@@IDENTITY时,插入还未发生,自然无法获取到正确的ID。
内容的提问来源于stack exchange,提问作者Jonas Mærsk
相关产品推荐
相关产品推荐

