更新或插入新值
本文关键字:新值 插入 更新 | 更新日期: 2023-09-27 18:04:03
我在asp.net中有以下SQL命令:
cmd = connection.CreateCommand();
cmd.CommandText = "INSERT INTO userscore (username, score)VALUES(@username, @score)";
cmd.Parameters.AddWithValue("@username", username);
cmd.Parameters.AddWithValue("@score", userscore);
cmd.ExecuteNonQuery();
这个命令工作,但它存储两个值在我的sql数据库中的每一个按钮点击。它从文本框中获取分数值,但是当用户名+分数已经在数据库中时,我想更新值。有人能帮我查询得到这个完成吗?
澄清我的问题:我想存储新分数,即使它低于当前分数,用户名在表中是唯一的
我假设您只想为每个用户名存储一个hilicore,而不是只有一个全局hilicore。
DECLARE @highscore int NULL
SELECT @highscore = MAX(score) FROM userscore WHERE username = @username
IF @highscore IS NULL BEGIN
INSERT INTO userscore ( username, score ) VALUES ( @username, @score )
END ELSE IF @score > @highscore BEGIN
UPDATE userscore SET score = @score WHERE username = @username
END
这个T-SQL脚本需要两个参数,@username
和@score
。@highscore
变量在脚本中声明。
SQL 2008或以上版本:
MERGE INTO userscore as target
USING(VALUES(@username, @score)) AS source(UserName, Score)
ON (target.UserName = source.UserName)
WHEN MATCHED THEN
UPDATE SET Score = source.Score)
WHEN NOT MATCHED THEN
INSERT(UserName, Score) VALUES(source.UserName, source.Score)
;
如果存在匹配的记录,MERGE
语句执行更新;如果不存在匹配的记录,则执行插入。这都是一个语句,所以你不必先检查记录是否存在。
复制/粘贴版本为:
cmd.CommandText = "MERGE INTO userscore as target USING(VALUES(@username, @score)) AS Source(UserName, Score) ON (target.UserName = source.UserName) WHEN MATCHED THEN UPDATE SET Score = source.Score) WHEN NOT MATCHED THEN INSERT(UserName, Score) VALUES(source.UserName, source.Score);";
您可以使用一个存储过程,如果没有分数则插入分数,如果低于新分数则更新用户的分数
代码cmd = connection.CreateCommand();
cmd.CommandText = "update_highscore";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@username", username);
cmd.Parameters.AddWithValue("@score", userscore);
cmd.ExecuteNonQuery();
执行命令创建存储过程
CREATE PROCEDURE update_highscore
@username VARCHAR(30),
@userscore INT
AS
UPDATE userscore
SET score = @score
WHERE username = @username
IF @@ROWCOUNT = 0
INSERT userscore (username, score) VALUES (@username, @score)
如果用户名应该是表中唯一的,那么您可以使用更新查询和SqlCommand。ExecuteNonQuery (http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executenonquery.aspx) .
类似:
cmd.CommandText = "UPDATE userscore SET score = @score WHERE username = @username";
cmd.Parameters.AddWithValue("@username", username);
cmd.Parameters.AddWithValue("@score", userscore);
var numRowsAffected cmd.ExecuteNonQuery();
if(numRowsAffected == 0)
{
cmd.CommandText = "INSERT INTO userscore (username, score)VALUES(@username, @score)";
cmd.ExecuteNonQuery();
}