2014-07-02 72 views
2

我有以下SQL輸出插入新的數據或輸出ID的ID,而無需插入

TABLE Color(
    Color_id int IDENTITY(1,1) NOT NULL PRIMARY KEY, 
    Coloring_type [varchar](20) NULL, 
    ColorA int NOT NULL, 
    ColorB int NULL, 
    ColorC int NULL) 

一個簡單的表格,我想執行以下查詢插入一些數據並返回插入的COLOR_ID做一些東西在C#

INSERT INTO Color OUTPUT INSERTED.Color_id 
VALUES ('solid' ,'red' ,'green' ,'blue') 

無論如何,事實上,插入這樣可以使再次插入相同的值時,數據複製,所以我想打一個查詢,無論是插入數據,如果它是新的並輸出插入的id或輸出相同數據i的id如果它們已經插入到表中,我應該對查詢做出什麼改變?

+0

您正在使用哪種RDBMS? –

+0

Sql Server 2008 R2 –

回答

2

您可以嘗試使用下面的一個,

IF EXISTS (SELECT Color_id 
      FROM Color 
      WHERE Coloring_type = 'solid' AND ColorA = 'red' AND 
       ColorB = 'green' AND ColorC = 'blue') 
    BEGIN 
     SELECT Color_id 
     FROM Color 
     WHERE Coloring_type = 'solid' AND ColorA = 'red' AND 
       ColorB = 'green' AND ColorC = 'blue' 
    END 
ELSE 
    BEGIN 
     INSERT INTO Color OUTPUT INSERTED.Color_id 
     VALUES ('solid' ,'red' ,'green' ,'blue') 

     SELECT SCOPE_IDENTITY() --THIL WILL RETURN THE NEWLY ADDED Color_id 
    END 
2

您可以事先檢查EXISTS檢查是否存在記錄,然後根據結果執行代碼。

可以輸出的ID在2種方式,具有輸出參數,或者最簡單的方法是一個簡單SELECT並在C#中,你會打電話.ExecuteScalar,返回一個值:

IF EXISTS (SELECT 1 
      FROM Color 
      WHERE Coloring_type = 'solid' AND ColorA = 'red' AND 
       ColorB = 'green' AND ColorC = 'blue') 
    BEGIN 
     -- IT EXISTS UPDATE CODE GOES HERE 

     -- GET ID 
     SELECT ID 
      FROM Color 
      WHERE Coloring_type = 'solid' AND ColorA = 'red' AND 
       ColorB = 'green' AND ColorC = 'blue' 
    END 
ELSE 
    BEGIN 
     -- IT DOES NOT EXIST SO INSERT CODE GOES HERE 

     -- GET ID USING @@IDENTITY TO GET LAST INSERTED ID 
     SELECT @@IDENTITY 
    END 

如果這樣做在存儲過程中,你會採取的值作爲參數,並與@params替換的顏色值:

WHERE Coloring_type = @Color_type AND ColorA = @ColorA AND 
     ColorB = @ColorB AND ColorC = @ColorC 
+0

謝謝,但在這種情況下如何輸出Color_id? –

+0

@AboudZakaria更新後的位置 – Tanner

2

我不認爲你可以在一個聲明中這樣做,除非你使用MERGE()。但是你可以實現這個邏輯。

首先,您需要定義一個副本。讓我猜你希望所有四列都是唯一的:

create unique index idx_color(ColoringType, ColorA, ColorB, ColorC); 

這將強制執行條件。然後,您可以使用異常處理來得到你想要的東西:

begin try 
    INSERT INTO Color(ColoringType, ColorA, ColorB, ColorC) 
     OUTPUT INSERTED.Color_id 
     VALUES ('solid' ,'red' ,'green' ,'blue') 
end try 
begin catch 
    select @AlreadyInsertedId = Color_id 
    from Color 
    where ColoringType = 'solid' and colorA = 'red' and colorB = 'green' and colorC = 'blue' 
end catch; 

順便說一句,這是很好的做法,總是列出被插入insert語句中的列。

1

如果列設置爲primary key,它不會允許重複的值。所以,真正的問題是如何獲取和檢查錯誤。您可以使用嘗試,趕上在C#和捕捉使用SqlException e錯誤,象下面這樣:

catch (SqlException e) 
{ 
    switch (e.Number) 
    { 
     case 2601: 
     // Do something. 
     break; 
     default: 
     throw; 
    } 
} 

如果要檢查其他錯誤號,去這個site ..

如果沒有錯誤,你的數據被插入,那麼你可以使用下面的代碼獲得最後插入的行:

INSERT INTO table_name(col1,col2) 
OUTPUT INSERTED.Color_id 
VALUES(@col1, @col2); 

然後傳遞價值,C#變量:

Int32 newId = (Int32) myCommand.ExecuteScalar();