2011-07-07 66 views
1

UPDATE:這是正確的說法如果和空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

ISNULL是一個函數,所以你可以做後:

ISNULL(MyColumn, 'alternative value') 

你想要做的是:

IF (MyColumn IS NULL) 

如果列是null,其檢查。

+0

好,它已經工作..感謝您的幫助 – WithFlyingColors

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

你需要的是和NULL之間的空間。此外BEGIN是IF語句

0

使用此:

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

ISNULL - 是在SELECT子句中的函數,你不需要它。您還應該在IF聲明之後移動BEGIN關鍵字。

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) 
+0

哇..進展 – WithFlyingColors

+0

+1「[改變]你的表定義,使」聲譽「不可爲空 – onedaywhen

-1

首先,您需要在IF之後的下一行移動BEGIN。 SQL中IF的語法是:

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

它的工作原理沒有條款...看起來更新上面的答案 – WithFlyingColors

+0

對我來說,它的工作..每個用戶個別更新 – WithFlyingColors

+0

我不是說你的查詢將無法正常工作。我試圖指出,只有在您嘗試更新數據庫中所有用戶的信譽時,您的查詢纔是正確的。但是,如果您嘗試更新單個用戶的信譽(我不知道您的要求在這裏),則此查詢將導致您覆蓋其他所有用戶的數據。 – mohdowais