我有两个表,客户和应用程序,都有主键(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());
我如何将其转变为我想要它做的事情?
答案 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);
}
}