2013-01-23 63 views
1

我的表包含這些值插入到表,如果一個鮮明的值不存在

Name VARCHAR(50), 
Program VARCHAR(50), 
Branch VARCHAR(30), 
TotalP INT, 
TotalN INT) 

我一直在試圖將記錄插入到這個表,如果名稱不存在。這可能已經在這裏得到了答案,但是當我在搜索中輸入某些東西時,它會出現7000多個結果,我查看了100多個結果,但仍然沒有找到答案。任何和所有的幫助表示讚賞。

回答

2

如果您不擔心併發性,下面將工作:

IF NOT EXISTS (
    SELECT 1 
    FROM YourTable 
    WHERE Name = @Name 
) 
BEGIN 
    INSERT INTO YourTable (Name, Program, Branch, TotalP, TotalN) 
    VALUES (@Name, @Program, @Branch, @TotalP, @TotalN) 
END 

這裏的問題是,如果兩個進程試圖在同一時刻添加相同name ...都將通過IF NOT EXISTS檢查,然後兩者都會INSERT

爲了防止這種情況,您可將唯一約束添加到name列,這將導致插入的一個失敗,或者你可以使用WITH (UPDLOCK, HOLDLOCK),這將減少併發性,但不會提高鎖定表在NOT EXISTS檢查任何錯誤。

編輯:

如果您希望值來自SELECT聲明,以下將工作:

INSERT INTO YourDestinationTable (Name, Program, Branch, TotalP, TotalN) 
SELECT st.Name, st.Program, st.Branch, st.TotalP, st.TotalN 
FROM 
    YourSourceTable st 
    LEFT JOIN YourDestinationTable dt 
     ON dt.Name = st.Name 
WHERE 
    dt.Name IS NULL 
    -- Add in any other conditions for YourSourceTable here... 

這將從YourSourceTable插入行,如果該行不YourDestinationTable找到。 ..執行使用LEFT JOINIS NULL檢查。

這與之前的警告一樣...如果兩個進程同時運行這個語句,最終可能會出現重複的name值;無論是添加上name唯一約束,或在目標表中的行,你生存交易的內部測試執行(UPDLOCK, HOLDLOCK)

BEGIN TRANSACTION 
    IF NOT EXISTS (
     SELECT 1 
     FROM 
      YourSourceTable st 
      JOIN YourDestinationTable dt WITH (UPDLOCK, HOLDLOCK) 
       ON dt.Name = st.Name 
     -- WHERE 
      -- Add in any other conditions for YourSourceTable here... 
    ) 
    BEGIN 
     INSERT INTO YourDestinationTable (Name, Program, Branch, TotalP, TotalN) 
     SELECT Name, Program, Branch, TotalP, TotalN 
     FROM YourSourceTable st 
     -- WHERE 
     -- Add in any other conditions for YourSourceTable here... 
    END 
COMMIT 
+0

這可能是顯而易見的,但是,我會怎麼做,如果我想插入的值來自SELECT語句?感謝您的幫助 –

+0

你真棒!我無法相信,逃脫了我:)謝謝! –

相關問題