2013-04-18 57 views
0

我有兩個表,客戶和應用程序,都有主鍵(customerID和applicationID),應用程序有一個外鍵的customerID。SQL檢查是否存在值並返回主鍵

當用戶啓動應用程序時,它將customerId與其他一些信息一起添加到應用程序表中。

我想要做的是編寫一個sql查詢/存儲過程,首先檢查該customerId是否已經在應用程序表中,如果它不再添加它,但更新信息併爲我返回applicationId使用。

然後,如果它不在表格中,請添加客戶ID和信息,並返回applicationID。

我的代碼添加到數據庫是。

INSERT INTO Application (CustomerID, Q5, Q11a) VALUES (@customerid,@q5, @q11a);" + "Select Scope_Identity()"; 

int applicationID = Convert.ToInt32(command.ExecuteScalar()); 

我該如何去把它變成我想要的呢?

+0

使用MERGE語句如果你使用的是2008(r2)或2012。如果不是,只需從更新開始,如果爲0,則插入@@ row_count。 – Serge

回答

1

可以使用MERGE聲明,以執行插入或更新操作。之後,您可以使用SELECT聲明以獲得ApplicationId。查詢應該是這樣的:

MERGE Application AS target 
    USING (SELECT @customerid,@q5, @q11a) AS source (CustomerID, Q5, Q11a) 
    ON (target.CustomerID = source.CustomerID) 
    WHEN MATCHED THEN 
     UPDATE SET Q5 = source.Q5, Q11a = source.Q11a 
    WHEN NOT MATCHED THEN 
     INSERT (CustomerID, Q5, Q11a) VALUES (source.CustomerID, source.Q5, source.Q11a 
); 
SELECT ApplicationID FROM Application WHERE CustomerID = @customerid; 
+0

完美的是我在尋找的感謝。 – saintsfanuk

1

您應該使用Merge/Upsert

維基百科代碼:

MERGE INTO TABLE_NAME USING table_reference ON (condition) 
    WHEN MATCHED THEN 
    UPDATE SET column1 = value1 [, column2 = value2 ...] 
    WHEN NOT MATCHED THEN 
    INSERT (column1 [, column2 ...]) VALUES (value1 [, value2 ... 
0
CREATE PROCEDURE CustomerProc @CustomerID INT 
    ,@AppId INT OUTPUT 
AS 
BEGIN 
    IF EXISTS (
      SELECT * 
      FROM customer 
      WHERE customerId = @CustomerID 
      ) 
    BEGIN 
     UPDATE customer 
     SET /* fields to update */ 
     WHERE customerId = @CustomerID 
    END 
    ELSE 
    BEGIN 
     INSERT INTO customer (
      customerId 
      ,/* fields to insert*/ 
      ) 
     VALUES (@CustomerID /* values to insert*/); 

     SELECT @AppId = customerId 
     FROM customer 
     WHERE customerId = @CustomerID; 
    END 
END 

撥叫SSMS的PROC使用exec CustomerProc @CustomerID=/*number*/

如果您使用的ADO.Net那就試試這個:

using(SqlConnection con = new SqlConnection("your connection string")){ 
conn.Open(); 
using(var command = new SqlCommand("ProcedureName", conn)) { 
    command.CommandType = CommandType.StoredProcedure; 

    SqlParameter param = new SqlParameter("@CustomerID",SqlDbType.Int); 
    param.Value = /* your value */; 
    param.Direction = ParameterDirection.Input; 

    SqlParameter param2 = new SqlParameter("@AppId",SqlDbType.Int); 
    param2.Direction = ParameterDirection.Output; 

    command.Parameters.Add(param); 
    command.Parameters.Add(param2); 

    command.ExecuteNonQuery(); 

    Console.WriteLine(command.Parameters["@AppId"].Value); 
    } 
} 
相關問題