2009-11-21 94 views
4

我想創建一個執行上如果 該列不包含已存在於數據庫,應該允許插入時,COUNT(場)= 0或值的列插入或更新操作的存儲過程當COUNT(field)= 0或1時更新並且我應該知道這些操作是否被執行。 請解決我使用COUNT的問題不存在,因爲這不適用於更新。更新和插入存儲過程

我在ASP.net工作 - 我有需要要保持獨特而不使用唯一約束的表的兩列。所以,我想這樣的一個過程:

create proc usp_checkall @field1 varchar(20), 
         @field2 varchar(20), 
         @ID int, 
         @count int output 

現在您的更新查詢/基礎上插入@字段1 & @場2的@id

+0

是這個SQL服務器? – JohnIdol 2009-11-21 20:14:22

+0

你已經試過了什麼? – 2009-11-21 20:17:27

+0

是的我正在談論SQL服務器 – 2009-11-21 21:14:29

回答

0
if Exists select * from Yourtable WHere Your Criteria 
begin 
    update ... 
end 
else 
begin 
    insert ... 
end 
+0

EXISTS是否會鎖定所查詢的PK,使得在此期間沒有其他用戶執行INSERT的可能性?如果不是,那麼EXISTS找到NO行的可能性不大,但隨後的INSERT失敗,因爲該行已被插入(到那時爲止)。我不知道答案WRT隔離級別,因此我的問題。 – Kristen 2009-11-21 21:45:56

+0

存在也將無法更新。假設如果用戶更新記錄並輸入數據庫中已存在的值,則存在將允許用戶執行不正確的更新操作 – 2009-11-21 21:54:27

0

這種做法會做的伎倆。 @AlreadyExisted可以是sproc上的OUTPUT參數,以便您的調用代碼在返回時進行檢查。

DECLARE @AlreadyExisted BIT 
SET @AlreadyExisted = 0 

IF EXISTS(SELECT * FROM YourTable WHERE YourField = @FieldValue) 
    BEGIN 
     -- Record already exists 
     SET @AlreadyExisted = 1 

     UPDATE YourTable 
     SET.... 
     WHERE YourField = @FieldValue 
    END 
ELSE 
    BEGIN 
     -- Record does not already exist 
     INSERT YourTable (YourField,....) VALUES (@FieldValue,.....) 
    END 
+0

感謝您的回覆。但作爲一個初學者,我仍然無法讓你的答覆爲我工作。 – 2009-11-21 21:18:20

+0

你需要更具體一些,什麼部分不起作用? – 2009-11-21 21:20:36

+0

讓我解釋一下確切的場景。我在ASP.net工作我有一個表的tw0列,需要保持唯一性,而不使用唯一的約束。所以我想要一個像這樣的過程。創建proc usp_checkall @ field1 varchar(20),@field2 varchar(20),@ ID int,@ cunt int output現在您的查詢更新/插入@ field1,@ field2基於@編號 – 2009-11-21 21:25:39

1

用途:

INSERT INTO your_table 
    (column) 
VALUES 
    ([ your_value ]) 
WHERE NOT EXISTS (SELECT NULL 
        FROM your_table 
        WHERE t.column = [ your_value ]) 

這將SQL服務器,MySQL和甲骨文,Postgres的上工作。所有需要的是使用db適當的變量引用。 IE:對於MySQL & SQL服務器:

INSERT INTO your_table 
    (column) 
VALUES 
    (@your_value) 
WHERE NOT EXISTS (SELECT NULL 
        FROM your_table 
        WHERE t.column = @your_value) 

,察看是否有插入,得到基於@@ ROWCOUNT如果使用SQL Server的價值。如果您使用的是Oracle,請使用SQL%ROWCOUNT。

8

如果你碰巧有SQL Server 2008中,你也可以嘗試:

MERGE dbo.SomeTable AS target 
    USING (SELECT @ID, @Field_1, @Field_2) AS source (ID, Field_1, Field_2) 
     ON (target.ID = source.ID) 
    WHEN MATCHED THEN 
     UPDATE SET Field_1 = source.Field_1, Field_2 = source.Field_2 
    WHEN NOT MATCHED THEN 
     INSERT (ID, Field_1, Field_2) 
     VALUES (source.ID, source.Field_1, source.Field_2) 
+0

對於Sql2008中的MERGE語法+1。 – 2009-11-27 03:53:57