创建SQL任务和映射参数

时间:2017-07-12 23:13:48

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

我有一个文件名“Sales_20170331”。 现在我需要从这个文件中加载一个事实表。 该表包含Sales_quarter_date,SaleId列 sale_quarter_date列是从我在ssis中创建的@FileName变量加载的。 现在我需要在SSIS中创建执行sql任务,该任务将删除事实表中sales_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任务吗?

1 个答案:

答案 0 :(得分:0)

您为执行而编写的当前查询无法满足'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。在这个时候,你有同样的查询。

  5. 您可能面临的最大错误是,您自己提供参数名称。尝试按以下方式修改查询 -

    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”用户变量。