如何使用Slick纯SQL与SQL Server返回自动生成的ID

时间:2013-10-02 20:33:28

标签: sql-server scala jdbc slick

我想将自动生成的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)})

3 个答案:

答案 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?