2016-05-27 98 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'的需求嗎? –