簡體   English   中英

從C#SQLCLR存儲過程批量插入SQL表的最快方法

[英]Fastest way to bulk insert in SQL Table from C# SQLCLR Stored Procedure

我有一個C#SQLCLR存儲過程,其中第一個數據填入一些字典並計算,然后輸出存儲在其他一些字典中。

由於字典的使用,這種計算非常快速地完成,並且完全證明了我需要使用CLR存儲過程而不是普通的SQL存儲過程。

但是,我必須從這些輸出字典中保存SQL中某些表中的數據,這部分需要花費很多時間,並且不需要整個SQLCLR proc更快。

我必須迭代每個輸出字典的每個鍵,然后必須創建插入查詢,然后必須以下列方式運行ExecuteNonQuery: 在此輸入圖像描述

那么如何才能改進這種方法,以便在插入數據時不需要花費時間。 我不能使用SqlBulkCopy因為它不接受進程內連接 (即"Context Connection = true;" )作為connectionString。 那么還有其他更快的方法嗎? 提前致謝。

使用SqlBulkCopy類或者您可以在sql創建自己的User-Defined Table Type ,在c# - 將數據生成到DataTable ,而不是某些集合,它將與您的用戶定義類型匹配,然后將您的DataTable作為SqlParameter傳遞並執行。 或者,您可以將您收藏直接進入表值參數,如圖所示這里 (的useDataTable == false部分)

當然,為此您應該使用sql存儲過程。 sql用戶定義的表類型的調用部分將如下所示:

cmd = new SqlCommand{ Connection = conn, ...
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "sp_YourStoredProcedureName";
cmd.Parameters.Add(new SqlParameter("@UserDefinedTypeParameterName", yourDataTable));
cmd.ExecuteNonQuery();

你有幾個選擇:

  1. 創建用戶定義的表類型(UDTT)和接受UDTT作為參數的T-SQL存儲過程(即表值參數(TVP))。 由於您已經擁有集合中的數據,因此絕對不要創建單獨的DataTable來傳輸數據,因為這只是浪費時間,內存和CPU。 您可以通過創建返回IEnumerable<SqlDataRecord>的方法,將其本機集合中的數據直接流式傳輸到TVP中,使用yield return; ,並用作表示UDTT的SqlParameter的值。 我在SO上有兩個例子:

  2. 如果只有一個表要填充(因此有1個結果集),那么您可以從存儲過程中將集合作為結果集輸出,並按如下方式使用它:

     INSERT INTO schema.table (column_list) EXEC schema.SQLCLR_stored_procedure @param1, ....; 
  3. 如果只有一個表要填充(因此有1個結果集), 並且如果你沒有通過Context Connection做任何違反標量函數規則的事情,那么你可以嘗試將SQLCLR存儲過程更改為TVF,返回IEnumerable ,並通過yield return;迭代yield return; 把它流出來。 我在幾年前寫了一篇文章,在SQL Server Central上有一個例子: CLR表值函數示例和全流媒體(STVF / TVF)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM