SqlBulkCopy應該幫助執行大量的插入操作,而不是發送單個插入語句。但是,調用存儲過程呢?我有一個數據傳遞給它的過程,然後它在另一個表中執行一些查找,並可能在該查找表中插入第二個數據。用於存儲過程的SqlBulkCopy
由於這不能轉換爲查詢,有沒有辦法使用SqlBulkCopy存儲過程調用,或者它沒有任何意義?
我只在一個時間每個數據庫連接2000或更少的電話,但想知道是否有更有效的方法。
SqlBulkCopy應該幫助執行大量的插入操作,而不是發送單個插入語句。但是,調用存儲過程呢?我有一個數據傳遞給它的過程,然後它在另一個表中執行一些查找,並可能在該查找表中插入第二個數據。用於存儲過程的SqlBulkCopy
由於這不能轉換爲查詢,有沒有辦法使用SqlBulkCopy存儲過程調用,或者它沒有任何意義?
我只在一個時間每個數據庫連接2000或更少的電話,但想知道是否有更有效的方法。
基於@Kev回答,您可以將批量插入到臨時表中,然後您可以使用觸發器啓動存儲過程。
我假設你有一個FK約束到你的其他表,所以你需要在插入到目標表之前的值。如果可能,您可以嘗試刪除約束。做你的批量插入,然後觸發器可以在之後更新列。
這也適用於SqlBulkCopy.BatchSize - 適用於非常大的數據塊,因爲它爲您提供批量處理。 – bland 2016-03-16 11:57:55
唯一可以這樣做的方法是在目標表上設置觸發器並設置SqlBulkCopyOptionsFireTriggers
選項。
從那裏你可以調用你的存儲過程或把存儲過程邏輯放在那個觸發器中。
如果表被附加到其他客戶端(例如網絡應用程序),那麼您需要有一些區別大容量複製客戶端和其他常規應用程序的方法。我猜你可以通過在連接字符串中設置應用程序名稱值並使用SELECT APP_NAME()
在觸發器中檢查它來區分。
觸發器將無法正常工作,因爲sproc必須先從另一個表中選擇以查看是否存在某個鍵,如果不存在,那麼它將插入並獲取該鍵,然後將插入操作插入到目標表中。所以這是一個選擇,[插入]插入。 – 2011-05-11 22:42:13
如果你想要在插入的每一行上運行存儲過程,那麼你有點挫敗插入的目的,即快速插入大量記錄。我將插入到一個臨時表中,然後修改存儲的proc以使用set邏輯來一次操作整個數據集。
數據庫效率或您的應用程序效率? – 2011-05-11 21:40:24
@Autstin SqlBulkCopy旨在幫助提高SQL方面的效率。 – 2011-05-11 22:43:48