2016-05-27 61 views
0

我使用SQL Server 2016的SQL Server 2016 SSIS从存储过程中获取光标

  1. 我有一个需要输入参数过滤器和输出CURSOR参数

  2. 我想要一个存储过程GET_RECORDS将光标放入我的SSIS包中

  3. 我已经创建了数据流任务,OleDb源和参数值的变量。然后映射参数

Params mapping screen

但是当我想保存组件 - 我得到一个错误

error screen

我想补充条款WITH RESULT SETS有一些虚拟列,但我程序不返回任何结果集

我在做什么错?

任何建议将有帮助。

谢谢。

对此,尤里。

+0

我从来没有听说过能够输出游标。这是2016年的新事物,还是只是一厢情愿? –

+0

这是一个要求。我想知道是否有可能实现它) –

回答

0

源组件试图确定将返回哪些列和类型。因为您正在使用动态SQL,所以每次运行元数据时都可能会更改。

使用结果集可以定义要返回的数据,但只有在保证每次执行时都有这些结果的情况下才能使用。

编辑: 我创建一个连接并运行命令,以便它填充数据表。然后我把列标题放入一个字符串数组中。那里有很多例子。

然后我使用下面的函数来创建一个目标表。最后,我创建一个datareader并将其传递给.Net SqlBulkCopy。希望这可以帮助。

private void CreateTable(string TableName, string[] Fields) 
     {     

      if (TableExists(TableName) && Overwrite) 
      { 
       SqlCommand = new SqlCommand($"Drop Table [{TableName}]", SqlConnection); 
       SqlCommand.ExecuteNonQuery(); 
      } 

      string Sql = $"Create Table [{TableName}] ("; 

      int ColumnNumber = 1; 
      foreach (string Field in Fields) 
      { 
       string FieldValue = Field; 
       if (! HasHeaders) 
       { 
        FieldValue = "Column" + ColumnNumber; 
        ColumnNumber++; 
       } 
       Sql += $"[{FieldValue}] Varchar(8000),"; 
      } 
      Sql = Sql + "ImportFileID Int, ID Int Identity(1,1) Not Null, Constraint [PK_" + TableName + "] Primary Key Clustered ([ID] Asc))"; 

      SqlCommand = new SqlCommand(Sql, SqlConnection); 
      SqlCommand.ExecuteNonQuery(); 
     } 
+0

嗨,乔。 谢谢你的回答。 在你的例子中,有一个静态表。但是我将entity_name作为输入参数传递给过程,这就是为什么我无法设置静态结果集,因为结果集取决于所选的实体表。 这就是为什么我试图提取它们作为输出参数。 也许最好是输出行集而不是光标? 至于Yuriy。 –

+0

当我在SSIS中使用动态结构时,我使用脚本任务。您可能可以使用API​​。我会用动态导入xls/csv时使用的一些c#代码更新我的答案。 –

0

使用ado.net源代替oledb源代码,定义一个简单的select并获取您希望返回的列。现在您可以在数据流属性中定义expresión。

搜索ado.net源动态SQL

:)

+0

你能详细解释一下这个问题吗?它是如何回答这个问题的?它会替代返回一个'CURSOR'的需求吗? –