sql - 如何使用 GO-MSSQLDB 驱动程序获取最后插入的 ID?

标签 sql sql-server go

我收集到 SQL Server不会自动返回上次插入的 ID,我需要手动执行此操作:OUTPUT INSERTED.IDSQL insert 内声明。

我以后如何在 Go code 中取货? ?

有问题的功能是:

    func (sta *state) mkLogEntry(from time.Time, to time.Time, man bool) (id int64) {
    qry := "INSERT INTO ROMEExportLog(FromDate,ToDate,ExecutedAt,ExecutedManually,ExportWasSuccessful,UpdatedDaysIrregular) OUTPUT INSERTED.ID " +
        "VALUES(@FromDate,@ToDate,@ExecutedAt,@ExecutedManually,@ExportWasSuccessful,@UpdatedDaysIrregular)"
    res, err := sta.db.Exec(qry,
        sql.Named("FromDate", from),
        sql.Named("ToDate", to),
        sql.Named("ExecutedAt", time.Now()),
        sql.Named("ExecutedManually", man),
        sql.Named("ExportWasSuccessful", false),
        sql.Named("UpdatedDaysIrregular", false),
    )
    if err != nil {
        log.Fatal(err)
    }
    id, err = res.LastInsertId()

    if err != nil {
        log.Fatal(err)
    }
    return
}

res.LastInsertId()返回 There is no generated identity value .

最佳答案

对于 SQL 服务器:

这可能是噱头......但我发现使用 QueryRow 将运行多个 查询/命令并只返回LAST 行。

if err := db.QueryRow(`
    INSERT INTO [TABLE] ([COLUMN]) VALUES (?); 
    SELECT SCOPE_IDENTITY()`, 
    colValue
).Scan(&id); err != nil {
    panic(err)
}

只要 SELECT SCOPE_IDENTITY() 是返回的最后一行,那么这基本上完成了我预期的 result.LastInsertId() 要做的事情。

关于sql - 如何使用 GO-MSSQLDB 驱动程序获取最后插入的 ID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53001888/

相关文章:

sql - 如何从另一个模式中选择特定于 Oracle 模式的 View

mysql - 在表 A 中选择具有相同日期值且类别 = 1 的行

sql - 有没有办法改变设计而不从头开始创建表格?

python - 带有 MultiIndex 列的 Pandas to_sql 索引

ajax - 如何使用 Protocol Buffer 序列化 Go 结构并在 Dart over Ajax 中使用它们

php - 我的更新查询有什么问题?

mysql - SQL:来自具有不同日期格式的不同表的聚合

sql - TSQL - 何时使用 'not null'

unit-testing - 在 GoLang 的 sqlmock 中出错

Go:内联字符串连接