SQL Server每隔一行选择一次固定值

时间:2018-04-13 11:45:55

标签: sql sql-server ssis

我正在SSIS中创建一个进程,用于导入从供应商处收到的数据并将其导入表中。导入完成后,它将继续执行下一步,以创建固定宽度文件,以准备发送到另一个位置进行处理。我完全解析了第一行,但我需要在每行之间使用固定值99添加第二行作为预告记录。

当前行:

Col1       Col2      Col3   Col4          Col5                     
C1     AHS    X000501787    0477802       20180410      
C1     AHS    Y000501832    0477805       20180410      
C1     AHS    Z000501844    0477803       20180410      
C1     AHS    E000501801    0477804       20180410      

以下所需结果:

Col1   Col2   Col3          Col4          Col5                     
C1     AHS    X000501787    0477802       20180410   
99
C1     AHS    Y000501832    0477805       20180410   
99
C1     AHS    Z000501844    0477803       20180410      
99
C1     AHS    E000501801    0477804       20180410

任何输入赞赏!

1 个答案:

答案 0 :(得分:0)

您将遇到的问题是您正在尝试构建多条记录输出,而SSIS不会这样做。它期望每行中每列的格式相同。

我见过人们使用的两种方法是每行连接所有列,将SSIS中的格式定义为一列文件,并处理查询中的所有字符串格式。这是一种非常脆弱的做事方式。如果您正在构建真正不同的线路,则需要这种方法。即。

val dbUrl = "jdbc:mysql://..."

import akka.NotUsed
import akka.actor.ActorSystem
import akka.stream.alpakka.slick.scaladsl.SlickSession
import akka.stream.alpakka.slick.scaladsl.Slick
import akka.stream.scaladsl.Source
import akka.stream.{ActorMaterializer, Materializer}
import com.typesafe.config.ConfigFactory
import slick.jdbc.GetResult

import scala.concurrent.Await
import scala.concurrent.duration.Duration

val slickDbConfig = s"""
 |profile = "slick.jdbc.MySQLProfile$$"
 |db {
 |  dataSourceClass = "slick.jdbc.DriverDataSource"
 |  properties = {
 |    driver = "com.mysql.jdbc.Driver",
 |    url = "$dbUrl"
 |  }
 |}
 |""".stripMargin

implicit val actorSystem: ActorSystem = ActorSystem()
implicit val materializer: Materializer = ActorMaterializer()
implicit val slickSession: SlickSession = SlickSession.forConfig(ConfigFactory.parseString(slickDbConfig))
import slickSession.profile.api._

val responses: Source[String, NotUsed] = Slick.source(
  sql"select my_text from my_table".as(GetResult(r => r.nextString())) // limit 100
)

val future = responses.runForeach((myText: String) =>
  println("my_text: " + myText.length)
)

Await.result(future, Duration.Inf)

另一种方法是制作每个列字符串,然后为“关闭”行,只是不提供值。

您将遇到的另一个问题是如何定义分组。你的情况比较简单,因为它只是“每一排”。同样,您要么在查询中执行此操作,要么以异步方式使用脚本组件,因为1行= 2行。