【问题标题】:Create a SQL task and mapping parameters创建 SQL 任务和映射参数
【发布时间】:2017-12-17 13:08:03
【问题描述】:

我有一个文件名“Sales_20170331”。 现在我需要从这个文件中加载一个事实表。 该表有列 Sale_quarter_date、SaleId sale_quarter_date 列是从我在 ssis 中创建的 @FileName 变量加载的。 现在我需要在 SSIS 中创建执行 sql 任务,该任务将删除事实表中 sale_quarter_date = @FileName 的行。如果 Quarter_date != @FileName 然后加载这些记录。 查询应该类似于

IF EXISTS (SELECT * FROM sys.objects 
WHERE object_id = OBJECT_ID(N'[dbo].[Facttable]') AND type in (N'U') 
AND (SELECT COUNT(*) FROM [dbo].[FactTable]) >0)

DELETE FROM [dbo].[FactTable] 
WHERE sale_quarter_date = @FileName

但查询中似乎有一些错误。 您能帮我修复查询并设计执行 sql 任务吗?

【问题讨论】:

  • 这个“一些错误”是什么?您收到什么错误消息?
  • 无法将这个特定的@filename 变量映射到我试图从中获取此日期的关键列
  • 我在您的查询中没有看到任何错误。问题一定出在其他地方。

标签: sql if-statement ssis sql-server-2012 parameter-passing


【解决方案1】:

您为执行而编写的当前查询未满足“if quarter_date != FileName”的需求。这是你可以做的 -

  1. 创建一个变量 sSaleQuarterDate_Existing
  2. 使用“执行 SQL 任务”并编写一个查询来获取现有的销售季度日期,如下所示。将 'ResultSet' 设置为 'Single Row' 并在 'ResultSet' 中添加分配结果集 -

    从 dbo.Facttable 中选择 max(SaleQuarterDate) 作为“SaleQuarterDate”

  3. 现在创建用于加载的“数据流任务”。将上述任务连接到此任务。双击连接并将评估表达式设置为 - 表达式和约束。在表达式中给出条件 - @[User::FileName] != sSaleQuarterDate_Existing。

  4. 创建另一个“执行 SQL 任务”。这是在条件匹配时需要用于从表中删除现有记录的记录。将“步骤 2”中的任务连接到此任务。再次执行与“步骤 3”相同的步骤,但这次将条件更改为 --@[User::FileName] == sSaleQuarterDate_Existing。在此任务中,您编写的查询与此相同。

您最可能面临的错误是,您给出了参数名称本身。尝试如下修改查询 -

IF EXISTS (SELECT * FROM sys.objects 
WHERE object_id = OBJECT_ID(N'[dbo].[Facttable]') AND type in (N'U') 
AND (SELECT COUNT(*) FROM [dbo].[FactTable]) >0)

DELETE FROM [dbo].[FactTable] 
WHERE sale_quarter_date = ?

在“参数映射”窗口中,分配“文件名”用户变量。

【讨论】:

  • 非常感谢 Karthik。这有帮助。我认为问题在于我直接在查询中给出了参数名称。现在我没有两个单独的任务,而是在同一个任务中给出了所需条件的删除语句和插入语句,现在它工作正常。
  • Yw。你能把它标记为已回答吗?这将有助于缩小未回答的问题范围。
猜你喜欢
  • 1970-01-01
  • 2020-01-05
  • 1970-01-01
  • 2016-09-08
  • 1970-01-01
  • 2020-07-06
  • 1970-01-01
  • 2021-10-28
  • 2016-07-16
相关资源
最近更新 更多