【问题标题】:How to make a "Run ID" in SQL Server and SSIS如何在 SQL Server 和 SSIS 中创建“运行 ID”
【发布时间】:2017-11-14 05:01:15
【问题描述】:

我有一份定期运行的报告,并将其放入暂存数据库进行审核。它通过 Microsoft 的 SQL Server 集成服务进行处理,用于转换数据;但是,我想添加一个“ID”列,每次运行趋势报告时该列都会递增为整数,但到目前为止还不能真正弄清楚如何做到这一点。

目标不是为每一行分配一个新编号,而是为一次运行的所有行分配相同编号

理想情况下,通过 SSIS 中的派生列比更改 SQL 代码更容易,但我会考虑这两个选项。

RunID   Name
----- |----------------
 1    |  A
 1    |  B
 1    |  C
 1    |  D
 2    |  A
 2    |  B
 2    |  C
 3    |  A

【问题讨论】:

  • 数据是否从临时表中删除?你能做类似RunID = (select max(RunID) from stg_table) + 1的事情吗? (注意是否还需要创建索引)
  • 如果您使用的是 2012 或更高版本,您可以使用序列对象,如果您使用的是 2008 或更低版本,则可以模拟一个。
  • 根据您的描述,日期和时间可能比简单的整数更有用。

标签: sql sql-server ssis etl derived-column


【解决方案1】:

如果运行 ID 绑定到 SSIS 包的执行,则可以使用 ExecutionInstanceGUID。 https://docs.microsoft.com/en-us/sql/integration-services/system-variables

您确定需要 SSIS 包来转换数据吗?大多数事情都可以在 T-SQL 中完成

【讨论】:

    【解决方案2】:

    您可以使用包变量实现此目的

    1. 您可以添加一个包变量来存储整数 @[User::RunID]
    2. 在每次执行包时,使用Execute SQL Task 使用类似查询从目标表中获取最大 RunID:

      select ISNULL(max(RunID),0) + 1 from stg_table
      
    3. 将此值作为ResultSet添加到变量中

    这样,每次执行包时该值都会增加 1

    更多关于 mappinf 结果到变量的详细信息在下面的链接中:

    【讨论】:

    • 你必须在数据流任务之前运行它,将值存储在一个变量中,然后在数据流任务中使用这个变量创建一个派生列
    【解决方案3】:

    为 RunID 创建一个包含 IDENTITY 列的表。该表可以包含您想要的有关运行的任何其他信息,但至少我会包含运行日期时间。

    SSIS 包中的第一步是在表中插入新行并获取 IDENTITY,并使用新行的 IDENTITY 填充包变量。那就是你的 RunID,然后你可以用它做任何你想做的事情。

    作为奖励,您将拥有跑步、跑步发生时间以及您选择存储的任何其他元数据的永久历史记录。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多