SQL检查值是否存在并返回主键

时间:2013-04-18 09:39:00

标签: c# sql sql-server

我有两个表,客户和应用程序,都有主键(customerID和applicationID),应用程序有一个customerID的外键。

当用户启动应用程序时,它会将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());

我如何将其转变为我想要它做的事情?

3 个答案:

答案 0 :(得分: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 ...

答案 1 :(得分: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;

答案 2 :(得分: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); 
   }
}
相关问题