【问题标题】:SSIS Parameter to Variable Switch可变开关的 SSIS 参数
【发布时间】:2017-08-09 00:05:17
【问题描述】:

我正在尝试通过在 SQL 任务中使用 swicth case SQL 语句将 SSIS 中的执行参数绑定到变量:

SELECT  @[User::StartTime]= 

CASE @[$Project::CmdParam] WHEN 'Full' THEN '20000101000100' WHEN 'Day-1' THEN (SELECT SUBSTRING(CONVERT(nvarchar(12),DATEADD("Day", -1, GETDATE() ), 112),0,12)+''+'235000') WHEN 'Day-2' THEN (SELECT SUBSTRING(CONVERT(nvarchar(12),DATEADD("Day", -2, GETDATE() ), 112),0,12)+''+'235000') WHEN 'Day-3' THEN (SELECT SUBSTRING(CONVERT(nvarchar(12),DATEADD("Day", -3, GETDATE() ), 112),0,12)+''+'235000') ELSE @[$Project::CmdParam]+'235000' END;

我能够在 SSMS 中运行查询,但它在我的包中失败。 它无法解析查询。

【问题讨论】:

  • 如果您使用的是 SQL 任务,则参数的占位符由驱动程序决定。您使用的是 OLE DB 还是 ADO.Net?
  • 请忽略我(现已删除)的评论。解决此问题的唯一方法是删除您的大部分代码并获得一个非常基本的示例并按您的方式工作。另外,请确认您的连接是 OLEDB 还是 ADO.Net

标签: variables ssis parameter-passing


【解决方案1】:
SELECT  
CASE WHEN @[$Project::CmdParam]='Full'  THEN '20000101000100'
     WHEN @[$Project::CmdParam]='Day-1' THEN (SELECT SUBSTRING(CONVERT(nvarchar(12),DATEADD("Day", -1, GETDATE() ), 112),0,12)+''+'235000')
     WHEN @[$Project::CmdParam]='Day-2' THEN (SELECT SUBSTRING(CONVERT(nvarchar(12),DATEADD("Day", -2, GETDATE() ), 112),0,12)+''+'235000')
     WHEN @[$Project::CmdParam]='Day-3' THEN (SELECT SUBSTRING(CONVERT(nvarchar(12),DATEADD("Day", -3, GETDATE() ), 112),0,12)+''+'235000')
     ELSE @[$Project::CmdParam]+'235000'
 END

确保Parameter Mapping 页面中的parameter name@[$Project::CmdParam] 完全匹配,并且CASE WHEN 的使用如上。更重要的是,reulst选择Single RowResult页面中的存储变量选择@[User::StartTime]

更新

就像尼克说的,切换到ADO.NetConnection Type,因为你使用的是SQL Server,那么你可以使用上面的映射方法,否则你必须使用?,替换每个@[$Project::CmdParam]查询,那么用于映射参数的Parameter Name 将在您的情况下为 0,1,2,3,4,与结果映射保持相同。

第二次更新 如果您现在使用ADO.net,请忘记0-4的事情,将以下查询粘贴到Execute SQL Task中的语句中:

SELECT  
CASE WHEN @a = 'Full'  THEN '20000101000100'
     WHEN @a = 'Day-1' THEN (SELECT SUBSTRING(CONVERT(nvarchar(12),DATEADD("Day", -1, GETDATE() ), 112),0,12)+''+'235000')
     WHEN @a = 'Day-2' THEN (SELECT SUBSTRING(CONVERT(nvarchar(12),DATEADD("Day", -2, GETDATE() ), 112),0,12)+''+'235000')
     WHEN @a = 'Day-3' THEN (SELECT SUBSTRING(CONVERT(nvarchar(12),DATEADD("Day", -3, GETDATE() ), 112),0,12)+''+'235000')
     ELSE @a + '235000'
 END

粘贴后,在同一页面选择Single Row作为Result set,然后进入Parameter Mapping页面,选择$Project::CmdParam作为Variable Name,输入@a作为Parameter Name,即将您的包变量映射到查询中的@a。然后进入Result Set页面,Add新结果,Result Name应该是0,选择User::StartTime作为存储查询结果的变量。

经过以上所有步骤,这次应该没问题了。

【讨论】:

  • 如果没有映射参数和存储的结果变量,不能直接将值解析成SSIS变量
  • 正确。在 SQL 任务中,这将需要一堆 ? 符号,然后需要对它们进行映射。不过,它在 Expression Task 中确实有意义。
  • @Nick.McDermaid 是的,在我使用? 引用所有参数之前,但是在长查询中为每个参数找到Parameter Name 有点困难,现在我更喜欢只使用参数名称直接如@parameterName,然后在Parameter Name 中,我只需要输入该特定参数的已知名称:)
  • 感谢您的建议,我仍然有错误:[执行 SQL 任务] 错误:正在执行查询。无法解析查询(关键字 ELSE 附近的语法不正确)。
  • 对于OP的情况,我不需要在每个WHEN之后加上?,然后需要计算Parameter Mapping页面中的索引号,相比之下,我只需要例如,在每个WHEN 后面加上@a,那么我只需要在parameter mapping 页面中分配一次@a
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-19
  • 2022-01-08
  • 2012-04-09
  • 1970-01-01
  • 1970-01-01
  • 2015-10-06
  • 1970-01-01
相关资源
最近更新 更多