0

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

当用户启动应用程序时,它会将 customerId 与其他一些信息一起添加到应用程序表中。

我想要做的是编写一个 sql 查询/存储过程,首先检查该 customerId 是否已经在应用程序表中,如果它不再添加它,而是更新信息并返回 applicationId 供我使用。

然后,如果它不在表中,则添加客户 ID 和信息并将应用程序 ID 返回给我。

我要添加到数据库的代码是。

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

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

我将如何把它变成我想要它做的事情?

4

3 回答 3

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 ...
于 2013-04-18T09:52:42.170 回答
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;
于 2013-04-18T09:53:30.537 回答
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); 
   }
}
于 2013-04-18T10:13:31.267 回答