2017-06-13 63 views
0

我正面臨一種情況,我需要一次將多達17,000行插入到SQL Server數據庫中。我已經想出了兩種方法來做到這一點,但是我被C#中的查詢參數化絆住了。參數化的多行插入SQL Server

一個警告:我擔心表現,但不排除其他 - 如果我正在做的操作需要8分鐘,那麼是否爲數據插入添加另外5秒對10秒並不重要。如果數據插入在初始操作之上需要額外的10分鐘,那麼這是一件大事。

選項1:多行插入(分塊)

第一個選擇是做一個簡單的多行插入:

INSERT INTO MyTable (FirstName, LastName, Age) 
    VALUES 
     ('Bob', 'Smith', 24), 
     ('Sally', 'Jones', 32), 
     ('Jennifer', 'Johnson', 23) 

我會通過一些建立幾個這樣的查詢喜歡這個。然而

var queriesNeeded = people.Count/250; 

for (int i = 0; i < queriesNeeded; i++) 
{ 
    var records = people.Skip(i * 250).Take(250); 
    BuildAndExecuteQuery(records); 
} 

// Handle anything left over 
var leftoverRecords = people.Skip(queriesNeeded * 250); 
BuildAndExecuteQuery(leftoverRecords); 

,雖然我知道如何: - (它的意思是說明我的觀點我在寫這離我的頭頂,所以幾乎可以肯定有一個錯誤在這裏這並不重要。)參數化一個基本的單行INSERT,我不知道如何去參數化一個INSERT,它可能有一個未知數量的變量。有沒有辦法做到這一點?我將如何去創建我的SqlCommand

選項2:SqlBulkCopy類

或者......我可以去SqlBulkCopy路線。我在這裏唯一的問題是,我找不到任何指示如何參數化的東西,或者我甚至需要。我是否需要擔心轉義數據或處理參數?

+0

是記錄了數據庫中的表或其他一些輸入? –

+1

使用表值參數,這是非常簡單的。 https://docs.microsoft.com/en-us/sql/relational-databases/tables/use-table-valued-parameters-database-engine –

+1

或SqlBulkCopy與DataTable,這意味着您不必擔心轉義任何東西。 –

回答

0

與此內存容量複製沒有太多的經驗,但我可以肯定回答:

我不知道如何去paramaterizing,可以有 未知數量的變量的INSERT它。

您可以通過在用於將它們添加到查詢中的相同循環中添加參數來執行此操作。

爲了延長您的僞代碼,你將取代這個:

BuildAndExecuteQuery(records); 

像這樣的東西:

foreach record in records 
{ 
    Add parameter(s) to the query 
    Add the same parameter(s) to the command's Parameters collection 
} 
ExecuteQuery