我的表包含這些值插入到表,如果一個鮮明的值不存在
Name VARCHAR(50),
Program VARCHAR(50),
Branch VARCHAR(30),
TotalP INT,
TotalN INT)
我一直在試圖將記錄插入到這個表,如果名稱不存在。這可能已經在這裏得到了答案,但是當我在搜索中輸入某些東西時,它會出現7000多個結果,我查看了100多個結果,但仍然沒有找到答案。任何和所有的幫助表示讚賞。
我的表包含這些值插入到表,如果一個鮮明的值不存在
Name VARCHAR(50),
Program VARCHAR(50),
Branch VARCHAR(30),
TotalP INT,
TotalN INT)
我一直在試圖將記錄插入到這個表,如果名稱不存在。這可能已經在這裏得到了答案,但是當我在搜索中輸入某些東西時,它會出現7000多個結果,我查看了100多個結果,但仍然沒有找到答案。任何和所有的幫助表示讚賞。
如果您不擔心併發性,下面將工作:
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 JOIN
和IS 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
這可能是顯而易見的,但是,我會怎麼做,如果我想插入的值來自SELECT語句?感謝您的幫助 –
你真棒!我無法相信,逃脫了我:)謝謝! –