更新:此声明是否正确
public void CheckReputationIfNull()
{
StringBuilder sb = new StringBuilder();
sb.Append("DECLARE @isReputationNull int");
sb.Append(" SET @isReputationNull=( SELECT Reputation");
sb.Append(" FROM Users u");
sb.Append(" INNER JOIN Comments c ON c.UsersID = u.UsersID");
sb.Append(" WHERE c.CommentsID = @CommentsID)");
sb.Append(" BEGIN IF ( @isReputationNull IS NULL)");
sb.Append("UPDATE u ");
sb.Append(" SET Reputation = 0");
sb.Append(" FROM Users u");
sb.Append(" END");
using (SqlConnection conn = new SqlConnection(AllQuestionsPresented.connectionString))
{
SqlCommand cmd = new SqlCommand(sb.ToString(), conn);
cmd.Parameters.Add("@CommentsID", SqlDbType.Int).Value = commentID;
conn.Open();
cmd.ExecuteNonQuery();
}
}
答案 0 :(得分:4)
ISNULL是一个函数,所以你可以这样做:
ISNULL(MyColumn, 'alternative value')
您想要做的是:
IF (MyColumn IS NULL)
检查列是否为NULL。
答案 1 :(得分:2)
更简单,单一陈述,不易出错:
UPDATE Users SET Reputation = COALESCE(Reputation,0) WHERE UserID = @UserID
或者,更新您的表定义,以便声誉首先不可为空(并且可选,因此默认为0)
或者,将它与你的other question结合起来(我仍然不确定你是否应该更新/修改那个),你可以:
UPDATE Users SET Reputation = COALESCE(Reputation,0) + @NewReputation
WHERE UserID = (select UserID from Comments where CommentID = @CommentID)
答案 2 :(得分:0)
IF (@isReputationNull IS NULL)
BEGIN
...
END
IS和NULL之间需要一个空格。 BEGIN也在IF声明之后
答案 3 :(得分:0)
使用此:
sb.Append(" IF @isReputationNull IS NULL BEGIN");
ISNULL
- 是select子句中的一个函数,您不需要它。您还应该在BEGIN
语句后移动IF
关键字。
答案 4 :(得分:-1)
首先,您需要在IF之后的下一行移动BEGIN。 SQL中IF的语法是:
DECLARE @test INT
SET @test = 1
IF (@test = 1)
BEGIN
PRINT 'test is equal to one'
END
其次,您没有在update语句中提供WHERE条件。如果您按原样执行语句,它将更新表中所有用户的信誉,可能导致您丢失数据。如果您只想初始化发布评论的特定用户的信誉,则需要包含WHERE UserID = @UserID(您可以在第一个查询中填充此变量)。
此外,如果您大量使用参数化查询,我建议您首先直接在SQL编辑器中创建查询(例如带有数据连接的Visual Studio或SQL Server Management Studio)。这将帮助您在将语句添加到代码之前识别并修复任何语法错误,因为一旦将它们转换为代码中的字符串,它们就变得更难调试。