【问题标题】:Query not working in execute SQL task in the ssis package查询在 ssis 包中的执行 SQL 任务中不起作用
【发布时间】:2020-11-03 15:41:05
【问题描述】:

此查询在 SQL Server 2005 的查询窗口中运行良好,但在 ssis 包中的 Execute SQL Task 中运行时抛出错误。

declare @VarExpiredDays int
Select  @VarExpiredDays= Value1 From dbo.Configuration(nolock) where  Type=11                      
  DECLARE  @VarENDDateTime datetime,@VarStartDateTime datetime                
  SET @VarStartDateTime= GETDATE()- @VarExpiredDays            
  SET @VarENDDateTime=GETDATE(); 

  select  @VarStartDateTime
  select  @VarENDDateTime
  
   SELECT * FROM
(SELECT CONVERT(Varchar(11),@VarStartDateTime,106) AS VarStartDateTime) A,
(SELECT CONVERT(Varchar(11),@VarENDDateTime,106) AS VarENDDateTime) B
  

这里有什么问题?

【问题讨论】:

  • 为什么你的问题被标记为c#
  • 如果您发布了引发的错误,您可能会获得更多帮助。此外,在进行比较时,可能会检查以确保您使用 SSIS 和 SSMS 连接到同一数据库/数据库服务器。

标签: ssis


【解决方案1】:

您的意图是检索 start 和 end 的值并将它们分配给 SSIS 变量。

正如@Diego 上面提到的,这两个 SELECTS 会造成麻烦。对于执行 SQL 任务,您的结果集选项是无、单行、完整结果集和 XML。放弃 XML 选项是因为我不想处理它,而 None 因为我们想要行返回,我们的选项是 Single 或 Full。我们可以使用 Full,但是我们需要返回相同数据类型的值,然后处理变得更加复杂。

通过消除过程,这导致我们使用单行结果集。

查询又名 SQLStatement

我通过简单地删除上述两个 SELECTS 来更正提供的查询。最终的select可以简化成如下(不用放到派生表中)

SELECT 
    CONVERT(Varchar(11),@VarStartDateTime,106) AS VarStartDateTime
,   CONVERT(Varchar(11),@VarENDDateTime,106) AS VarENDDateTime

下面使用的完整查询

declare @VarExpiredDays int
-- I HARDCODED THIS
Select  @VarExpiredDays= 10                 
  DECLARE  @VarENDDateTime datetime,@VarStartDateTime datetime                
  SET @VarStartDateTime= GETDATE()- @VarExpiredDays            
  SET @VarENDDateTime=GETDATE(); 

/*
  select  @VarStartDateTime
  select  @VarENDDateTime
*/
   SELECT * FROM
(SELECT CONVERT(Varchar(11),@VarStartDateTime,106) AS VarStartDateTime) A,
(SELECT CONVERT(Varchar(11),@VarENDDateTime,106) AS VarENDDateTime) B

验证执行 SQL 任务是否按预期运行。此时,只需将输出连接到 SSIS 变量即可。正如您在下面的结果窗口中看到的那样,我创建了两个包级变量 StartDateText 和 EndDateText,它们的类型为 String,默认值为空字符串。您可以在 Locals 窗口中看到它们分配的值对应于提供的源查询中的@VarExpiredDays = 10

只需配置执行 SQL 任务的结果集选项卡即可。最难的部分是确保您在源系统类型和 SSIS 类型之间有正确的映射。使用 OLE DB 连接,结果名称与查询中调用的列无关。这只是通过它们的序号位置(基于 0 的计数)来引用列的问题。

最后的想法是,我发现最好将事物保留在它们的基本类型中,例如 datetime 数据类型,并让接口将其格式化为漂亮的本地化值。

【讨论】:

    【解决方案2】:

    你有不止一种输出类型。您有两个变量和一个查询。 您只需要在“结果集”属性上选择一个

    您是否将这些映射到输出参数?

     select  @VarStartDateTime
     select  @VarENDDateTime
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      • 2017-12-17
      • 1970-01-01
      • 1970-01-01
      • 2011-09-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多