斯卡拉杜比。创建并插入临时文件 Table

Scala Doobie. Creating and Inserting into a Temp Table

我是 Scala 的新手,也是 Doobie 的新手。我正在连接到 SQL Server 2014,需要创建一个临时文件 table,然后插入该临时文件 table。在 SQL 服务器中,当您创建临时文件 table 并断开连接时,临时文件 table 会自动删除。

在下面的代码片段中,我遇到了这个异常:

Exception in thread "main" com.microsoft.sqlserver.jdbc.SQLServerException:  Invalid object name '#temp'

片段:

  val create: doobie.ConnectionIO[Int] = sql"CREATE TABLE #temp (tmp CHAR(20))".update.run

  val insert: doobie.ConnectionIO[Int] = sql"INSERT INTO #temp values ('abc'), ('def')".update.run

  val query: doobie.ConnectionIO[List[String]] = sql"select * from #temp  ".query[String].to[List]

  def wrapper(): ConnectionIO[List[String]] = {
    for {
      c <- create
      i <- insert
      q <- query
    } yield q
  }

wrapper().transact(xa).debug.as(ExitCode.Success)

我相信这是在告诉我 Doobie 正在删除创建和插入语句之间的连接?

expected/desired 行为是它将 return 一个 List("abc","def")

在此先感谢您的帮助!

更新:

这是我所知道的实际工作的一个小例子:

  val create = sql"CREATE TABLE #temp (tmp CHAR(20))"

  val insert: doobie.ConnectionIO[Int] = sql"INSERT INTO #temp values ('abc'), ('def')"


(create ++ insert).update.run.transact(xa).debug.as(ExitCode.Success)

(请注意,它仅适用于创建和插入部分,不适用于查询部分)

在我的笔记本电脑上用头撞了 1 周之后...我终于弄明白了。 Doobie 在执行 .query:

时实际上会执行“更新”命令
  val create: Fragment = sql"CREATE TABLE #temp (tmp CHAR(20))"

  val insert: Fragment = sql"INSERT INTO #temp values ('abc'), ('def')"

  val query: Fragment = sql"select * from #temp  "

  (create ++ insert ++ query).query[String].to[List].transact(xa).debug.as(ExitCode.Success)

输出:

List(abc             ,def            )