2014-11-08 58 views
1

我需要更新表中的記錄,但有可能記錄不存在,所以我需要插入記錄。通過ADO.NET命令對象執行多個SQL語句

下面是一條SQL語句,它通過首先更新記錄來完成我的目標,如果它不存在,它會執行插入操作。我在想,如果它可以通過ADO.NET命令對象直接執行,還是需要進入存儲過程。

UPDATE MyTable SET ReservationDate = @ReservationDate WHERE CustomerNumber = XXXX; 
IF @@ROWCOUNT=0 
    INSERT INTO MyTable (CustomerNumber , ReservationDate) 
    VALUES (@CustomerNumber , @ReservationDate) 

如果我可以經由命令對象,而無需存儲過程執行它這將意味着用於部署時間少一個依賴性(即部署存儲過程)。

回答

2

在T-SQL的MERGE command適用於只是這種情況下

string cmdText = @"MERGE MyTable T 
        USING (SELECT @CustomerNumber As CustomerNumber) as S 
        ON T.CustomerNumber = S.CustomerNumber 
        WHEN MATCHED UPDATE SET ReservationDate = @ReservationDate 
        WHEN NOT MATCHED INSERT INTO (CustomerNumber , ReservationDate) 
            VALUES (@CustomerNumber , @ReservationDate)"; 

它是文本中越多虧線爲了便於閱讀,以逐字字符@

隨着MERGE的只是一個字符串,你開始定義您的表(T)TARGET,然後您使用包含TARGET中主鍵字段值的參數構建一個名爲SOURCE(S)的僞指令。現在這兩張表是JOINED ON的字段CustomerNumber。此連接的產品可能是MATCHEDNOT MATCHED,具體取決於TARGET表中以前存在的記錄。查詢的其餘部分可能是自我解釋的,只需注意在兩個操作(UPDATE和INSERT)中不需要重複MyTable名稱(它是目標)

順便說一句,是的,你可以傳遞多個以分號分隔的SqlCommand命令

+0

真棒答案和水晶般清晰的例子!我從來不知道「合併」命令。謝謝! – webworm 2014-11-08 21:55:22

+0

如果在確定更新/插入哪些記錄時使用了更多的字段,這也可以工作嗎?例如......如果它不僅僅是CustomerNumber,還有更新/插入預訂時使用的VehicleNumber?就像客戶擁有多輛車一樣。 – webworm 2014-11-08 22:32:34

+1

爲什麼不能?只需準備適當的參數,使用它們來構建SOURCE表並調整JOIN以匹配/不匹配目標的主鍵。更新或插入如下 – Steve 2014-11-08 23:45:15