2012-05-11 78 views
0

以下查詢不會失敗,但不會插入唯一值。使用不存在的參數插入

我只想插入唯一值

DECLARE @user_id AS varchar(80) 
DECLARE @real_name as varchar(250) 

- 新的獨特的價值觀是「AAA」,他們不會在目標表中存在

SET @user_id = 'aaa' 
SET @real_name = 'aaa' 

INSERT INTO TargetTable 
    ([user_id],real_name) 
SELECT @user_id, @real_name 
WHERE NOT EXISTS 
    (SELECT [user_id],real_name FROM TargetTable) 
+1

你確定你沒有遺漏第二選擇中的where子句嗎? – MilkyWayJoe

+0

我不應該在第二選擇的地方,因爲我選擇了所有這些。 –

+0

所以你只想插入,如果表是空的? – MilkyWayJoe

回答

1

你在做什麼,嘗試不同的方法是這樣的:

-- if the count of records with that @user_id and @real_name is less or equal to 0, 
-- that means it's not in the table 
IF (0 >= (SELECT COUNT(*) FROM TargetTable WHERE @user_id = [user_id] AND @real_name = [real_name])) 
BEGIN 
    -- then call a normal insert 
    INSERT 
    INTO TargetTable ([user_id], real_name) 
    VALUES    (@user_id , @real_name) 

END 
+0

0 <=(SELECT COUNT(*))。 ..)'?而且,這種解決方案在多用戶環境中不安全。 –

+0

這將始終爲真> 0,如果有重複項 –

+0

意外鍵入了<='而不是'> =' – MilkyWayJoe

0

查詢將插入的唯一途徑一行是如果數據庫中沒有「aaa」,「aaa」的行。

看,你在做

SELECT 'aaa','aaa' 
WHERE NOT EXISTS 
(SELECT [user_id],real_name FROM TargetTable) 

因此,其'aaa','aaa'結果集「減」或「除」的結果集按列形成user_id說明,每排那對目標表的real_name。

所以,如果「AAA」,「AAA」已存在於第二個結果集,它會從最終的結果集排除在外,如果您有與插入的方式問題,因此不會被插入

+0

aaa是唯一的「NEW」值 –

0

如果有人仍然在意,或稍後看這個問題......。

原來的問題是,OP使用提供檢查任何行現有的目標表,而不是一個具體的一個WHERE NOT EXISTS條款。所需要的是檢查要插入數據:

DECLARE @user_id AS varchar(80) 
DECLARE @real_name as varchar(250) 

--New Unique values are "aaa" and they do not exist in the target table 
SET @user_id = 'aaa' 
SET @real_name = 'aaa' 

INSERT INTO TargetTable 
    ([user_id],real_name) 
SELECT @user_id, @real_name 
WHERE NOT EXISTS 
    (SELECT 42 FROM TargetTable WHERE [user_id] = @user_id AND real_name = @real_name) 

(目前)接受的答案鼓勵地方兩個單獨的查詢都沒有TRANSACTION的好處執行的不安全設計。查詢之間發生的變化可能會導致不愉快的結果。

+0

你不認爲你的子選擇是一個單獨的查詢嗎?是的,如果你想要一個單一的查詢版本,我會在 –

+0

以下發佈一個@BrianWhite - 這是我的印象,它被有效地包裹在一個與INSERT相關的事務爲什麼我會覺得我要學習另一個關於SQL Server的令人不安的課程? – HABO

+0

你可能是對的:)我下面的版本是我想出了幾年前我曾經遇到過的一個競賽狀況問題,但我認爲我沒有嘗試過像你這樣的版本。 –

0

這是爲了解決user92546的問題。插入發生在查詢TargetTable的相同查詢中。唯一的選擇是反對變量,在插入過程中它們顯然不會改變,而表格可以在任何微秒改變。

DECLARE @user_id AS varchar(80) 
DECLARE @real_name as varchar(250) 

--New Unique values are "aaa" and they do not exist in the target table 
SET @user_id = 'aaa' 
SET @real_name = 'aaa' 

INSERT INTO TargetTable ([user_id],real_name) 
SELECT T1.user_id, T1.real_name 
FROM (select @user_id [user_id], @real_name [real_name]) T1 
LEFT JOIN TargetTable T2 
    on T1.user_id = T2.user_id 
    and t1.real_name = T2.real_name 
    and T2.user_id = @user_id 
    and T2.real_name = @real_name 
WHERE T2.user_id is null