簡體   English   中英

在存儲過程中插入或更新用戶定義的表類型

[英]Insert or Update user-defined table type in a stored procedure

我目前正在一個項目中,在該項目中,我經常向遠程數據庫中插入或更新大量數據。 數據量約為50組數據,每組500-800行,這些數據進入同一表。

當前,我有一個存儲過程,我呼吁每一行插入或更新(為便於閱讀而簡化):

ALTER PROCEDURE stat_memberstat_upsert
...
AS
BEGIN
UPDATE Memberstats ...

if(@@ROWCOUNT = 0)
BEGIN 
    INSERT INTO Memberstats ...
END
END

這是可行的,但是如您所見,它可以掛載到同一存儲過程的許多調用上(最壞的情況是大約100,000個調用)。 我正在研究用戶定義的表類型,這聽起來是一個不錯的解決方案,因為它減少了對數據庫服務器的調用,並且具有更大的結構。 問題是,當我查看解決方案,教程和文檔時,我發現沒有人提到用表類型執行插入/更新例程的方法。 它是插入或更新。

使用表類型時,有沒有辦法進行插入/更新調用?


另外,我考慮了兩種解決方法:

1:使用光標

我可以使用游標遍歷表類型值,並為每行調用上面的stat_memberstat_upsert過程。 這不會阻止對該過程的多次調用,但是由於這些調用是從本地存儲過程完成的,因此速度可能會增加。

如何在SQL Server存儲過程中的用戶定義表類型上進行ForEach? (回答“為什么不使用光標???”)

2:預先驗證數據

第二種解決方案是檢索已插入的行主鍵,針對傳入的數據對其進行驗證,然后將其排序為2個表,其中一個表用於插入,另一個表用於更新。 然后將兩個表都執行到數據庫。 這意味着我需要將其封裝在事務中,以使表在驗證和執行插入與更新過程中不會發生變化。

這些中的任何一個都是好的解決方案嗎?

兩種解決方案都可能進一步放慢速度。 您可以簡單地將插入語句插入表中

ALTER PROCEDURE stat_memberstat_upsert
...
AS
INSERT INTO Memberstats_temp ...
END

並具有一個批處理過程,該過程將以較低的通信量時間運行,以在刪除該臨時表之后從Memberstats_temp表中更新/插入Memberstats表。 如果您需要實時更新表,這將不是解決方案。

暫無
暫無

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

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