If и Null SQL заявления - PullRequest
1 голос
/ 07 июля 2011

ОБНОВЛЕНИЕ: это утверждение правильно

  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();
}

}

Ответы [ 5 ]

4 голосов
/ 07 июля 2011

ISNULL - это функция, поэтому вы можете сделать:

ISNULL(MyColumn, 'alternative value')

То, что вы хотите сделать:

IF (MyColumn IS NULL)

, которая проверяет, равен ли столбец NULL.

2 голосов
/ 07 июля 2011

Упрощенный, одиночный оператор, менее подверженный ошибкам:

UPDATE Users SET Reputation = COALESCE(Reputation,0) WHERE UserID = @UserID

Или обновите определение таблицы, чтобы репутация не обнулялась в первую очередь (и, при необходимости, по умолчанию 0)


Или, чтобы объединить его с вашим другим вопросом (я все еще не уверен, что вы не должны были просто обновить / изменить этот вопрос), вы могли бы иметь:

UPDATE Users SET Reputation = COALESCE(Reputation,0) + @NewReputation
   WHERE UserID = (select UserID from Comments where CommentID = @CommentID)
0 голосов
/ 07 июля 2011

Во-первых, вам нужно переместить BEGIN на следующую строку после IF.Синтаксис IF в SQL:

DECLARE @test INT
SET @test = 1

IF (@test = 1) 
BEGIN
    PRINT 'test is equal to one'
END

Во-вторых, вы не указали условие WHERE в своем операторе обновления.Если вы выполните свое заявление в том виде, в котором оно существует в данный момент, оно обновит репутацию всех пользователей в таблице, что может привести к потере данных.Если вы хотите инициализировать репутацию только для того конкретного пользователя, который оставил комментарий, вам нужно включить WHERE UserID = @UserID (вы можете заполнить эту переменную в первом запросе).

Кроме того, если выПри интенсивном использовании параметризованных запросов я бы рекомендовал сначала создавать запросы непосредственно в редакторе SQL (например, в Visual Studio с подключением к данным или в SQL Server Management Studio).Это поможет вам выявить и исправить любые синтаксические ошибки перед добавлением оператора в код, поскольку их становится намного сложнее отлаживать после преобразования их в строку в коде.

0 голосов
/ 07 июля 2011

Используйте это:

 sb.Append(" IF @isReputationNull IS NULL BEGIN");

ISNULL - это функция в предложении select, и она вам не нужна.Также вы должны переместить ключевое слово BEGIN после оператора IF.

0 голосов
/ 07 июля 2011
IF (@isReputationNull IS NULL)
BEGIN
...
END

Вам нужен пробел между IS и NULL.Также НАЧИНАЕТСЯ после заявления ЕСЛИ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...