gpt4 book ai didi

sql-server - 如何在单个事务中以流畅的方式运行多个普通 sql 查询?

转载 作者:行者123 更新时间:2023-12-03 17:51:34 29 4
gpt4 key购买 nike

我有一个 Play/Slick 应用程序,我需要在单个事务中运行多个普通 sql 查询,检索最后一个查询的结果,如下所示:

val id: Future[Int] = db.run {
sql"""
DECLARE @T TABLE (id INTEGER)
INSERT INTO Foo (name) OUTPUT INSERTED.id INTO @T VALUES ('bar')
SELECT id FROM @T
""".as[Int].head
}

上面的问题是它总是返回 1这是声明临时表的顶级查询的结果。我如何获得上次查询的结果?有问题的数据库是 MS SQL Server。 Play 2.5.4,Slick 3.1.1。

最佳答案

Slick 最重要的功能之一 Action s 是它们是可组合的,类似于 Scala Future s。恕我直言,文档并没有像它应该的那样对待它......这是一个例子:

val createAction = sqlu"""DECLARE @T TABLE (id INTEGER)"""
val insertAction = sqlu"""INSERT INTO Foo (name) OUTPUT INSERTED.id INTO @T VALUES ('bar')"""
val selectAction = sql"""SELECT id FROM @T""".as[Int].head

val composedAction = for {
createRes <- createAction
insertRes <- insertAction
selectRes <- selectAction
} yield selectRes

val id = db.run(composedAction.transactionally) // Future[...]

您可以更换 for领悟 flatMap s 和 map最后,如果你觉得它更容易。

Slick 还有两个方便的助手,即 DBIO.seq (按顺序运行查询, 丢弃 结果,返回 Unit )和 DBIO.sequence (相同但 保留 所有单个操作的结果)。

关于sql-server - 如何在单个事务中以流畅的方式运行多个普通 sql 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38659549/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com