我想将自动生成的ID从插入返回到带有标识字段的SQL Server表
我的第一次尝试返回带有ID的单行/列结果集,是使用SQL Server的@@ IDENTITY功能以及我的insert语句。
即。)
val fooId = db.withSession((session: scala.slick.session.Session) => {
(sql"""
INSERT INTO Foo VALUES ('bar')
SELECT @@IDENTITY""").as[Int].first()(session)
})
然而,在这种情况下,光滑总是返回1.
编辑:我撒谎,它总是返回1,我认为是受影响的行数。作为一个测试,我尝试修改查询,这样看看会发生什么,我收到一个异常“java.lang.ClassCastException:java.lang.Integer不能强制转换为scala.Tuple2”。在这种情况下,它似乎需要返回一个标量。val fooIdTuple = db.withSession((session: scala.slick.session.Session) => {
(sql"""
INSERT INTO Foo VALUES ('bar')
SELECT @@IDENTITY as Foo, 47 as Bar""").as[(Int, Int)].first()(session)
})
编辑2:这有效,但我认为这是两次往返。这可能意味着它也可能成为竞争条件的受害者:
val fooId = db.withSession((session: scala.slick.session.Session) => {
(sql"""INSERT INTO Foo VALUES ('bar')""").as[Int].first()(session)
(sql"""SELECT @@IDENTITY""").as[Int].first()(session)
})
编辑3:我对此的思考越多,我就越清楚,因为我使用了光滑的东西,这不是一个光滑的话题,而是更多的SQL Server和JDBC问题。这是我最新的解决方案。
val fooId = db.withSession((session: scala.slick.session.Session) => {
(sql"""
SET NOCOUNT ON
INSERT INTO Foo VALUES ('bar')
SET NOCOUNT OFF
SELECT @@IDENTITY""").as[Int].first()(session)
})
编辑4:这是最简洁的解决方案。它使用了OUTPUT feature的SQL Server(感谢PB)。
val fooId = db.withSession((session: scala.slick.session.Session) => {
(sql"""INSERT INTO Foo OUTPUT INSERTED.FooId VALUES ('bar')""").as[Int].first()(session)})
答案 0 :(得分:1)
鉴于我使用了slick(普通SQL),这不是一个简单的主题,而是更多的SQL Server问题。
这是最简洁的解决方案。它使用了OUTPUT feature的SQL Server(感谢PB)。
val fooId = db.withSession((session: scala.slick.session.Session) => {
(sql"""INSERT INTO Foo OUTPUT INSERTED.FooId VALUES ('bar')""").as[Int].first()(session)})
答案 1 :(得分:0)
只是在黑暗中拍摄...在INSERT
语句解决问题后添加分号会不会?
val fooId = db.withSession((session: scala.slick.session.Session) => {
(sql"""
INSERT INTO Foo VALUES ('bar');
SELECT @@IDENTITY""").as[Int].first()(session)
})
答案 2 :(得分:0)
如果我使用您的示例,则会发生错误。 userId是mySQL表中的自动增量字段。
sql"""
INSERT INTO `table`(`email`)
OUTPUT INSERTED.userId
VALUES ("theEmailAdress@test.de")
""".as[Int].firstOption
是否有一个灵巧的/ plainSQL本机解决方案来检索当前INSERT的自动递增ID?