2011-07-07 8 views
1

UPDATE:この文はあなたがIS NULLとの間のスペースを必要とするの場合とNullのSQL文

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

}

答えて

4

IF文の後にある列がNULLであるかどうかをチェックされ

IF (MyColumn IS NULL) 

+0

いいえ、それは働いています。助けてくれてありがとう – WithFlyingColors

0
IF (@isReputationNull IS NULL) 
BEGIN 
... 
END 

正しいです。あなたがやりたいことはある

ISNULL(MyColumn, 'alternative value') 

:また、BEGINは、あなたが行うことができるようにISNULL関数は、ある

0

使用この:

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

ISNULLは - SELECT句の関数であり、あなたはそれを必要としません。また、IFステートメントの後にBEGINキーワードを移動する必要があります。

2

、よりシンプルな単一のステートメント、エラーが発生しにくい:

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

あるいは、その評判が最初の場所でNULL可能ではありませんので、あなたのテーブル定義を更新する(必要に応じて、0になるように、それはデフォルト)


それとも、あなたのother question(私はまだあなたがちょうど更新されていない/ 1という改正すべきか分からない)とそれを組み合わせて、あなたが持っている可能性があり:

UPDATE Users SET Reputation = COALESCE(Reputation,0) + @NewReputation 
    WHERE UserID = (select UserID from Comments where CommentID = @CommentID) 
+0

wow..Impressive – WithFlyingColors

+0

{reputation'がnullableでないようにテーブルの定義を変更しました " – onedaywhen

-1

まず、IFの後の次の行でBEGINを移動する必要があります。 IFのIFの構文は次のとおりです。

DECLARE @test INT 
SET @test = 1 

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

第2に、更新ステートメントにWHERE条件を指定していません。現在の文を実行すると、テーブル内のすべてのユーザーの評判が更新され、データが失われる可能性があります。コメントを投稿したその特定のユーザーの評判のみを初期化する場合は、WHERE UserID = @UserIDを含める必要があります(この変数を最初のクエリに入力できます)。

また、パラメータ化されたクエリを頻繁に使用する場合は、まずSQLエディタで直接クエリを作成することをお勧めします(Visual Studio for Data ConnectionまたはSQL Server Management Studioなど)。これは、コード内の文字列に変換した後にデバッグするのが非常に困難になるため、コードにステートメントを追加する前に構文エラーを特定して修正するのに役立ちます。

+0

答えは – WithFlyingColors

+0

です。それは私のために働いていました。個々のユーザーごとに更新します – WithFlyingColors

+0

私はあなたのクエリが動作しないと言っているわけではありません。私はあなたのデータベース内のすべてのユーザーの評判を更新しようとしている場合にのみ、クエリが正しいことを指摘しようとしていました。ただし、単一のユーザーの評判を更新しようとしている場合(私の要件がここにあるのか分かりません)、このクエリによって他のすべてのユーザーのデータも上書きされます。 – mohdowais

関連する問題