none
字串相加

    問題

  • 小弟下一個指令

    update MyTable set MyField= MyField+ 'newstring'

     

    當MyField的值為null時, 'newstring' 都加不進去

    請問要如何解決呢?

    2008年2月2日 下午 11:04

解答

所有回覆

  • update MyTable set MyField= isnull(MyField, '') + 'newstring'
    2008年2月3日 上午 03:44
  • + (字串串連) 運算子的行為,在使用空白、長度為零的字串時,與使用 NULL 或未知的值時,各不相同。

     

    長度為零的字元字串可以指定為兩個單引號,引號內不含任何字元。長度為零的二進位字串可以指定為不含以十六進位常數指定之任何二進位值的 0x。

     

    串連長度為零的字串,一律會串連兩個指定的字串。當您使用含 Null 值的字串時,串連結果會隨著工作階段設定而不同。正如同在 Null 值上執行的算術運算,當未知的值加上 Null 值時,結果通常是未知的值,以 Null 值來執行的字串串連作業也應該產生 Null 結果。不過,您可以變更目前工作階段的 CONCAT_NULL_YIELDS_NULL 設定來變更這個行為。如需詳細資訊,請參閱<SET CONCAT_NULL_YIELDS_NULL (Transact-SQL)>。

     

    參考資料:

     

    + (字串串連) (Transact-SQL)  -- SQL Server 2005 線上叢書

    http://msdn2.microsoft.com/zh-tw/library/ms177561.aspx

     

    SET CONCAT_NULL_YIELDS_NULL (Transact-SQL)

    http://msdn2.microsoft.com/zh-tw/library/ms176056.aspx

     

    2008年2月3日 上午 09:08
  • 感謝 chhuang 大提供的方法。試用 2 樓 chhuang 大的 ISNULL 函數:

     

    // 成功的寫法:
    string ss = "UPDATE trd_contract SET ExchangeRate=ISNULL(ExchangeRate,0) " + TextBox1.Text + " WHERE ContractID=1";
    // ExchangeRate 欄位為 Decimal 型別。
    // 若欄位內的值已曾被寫入(已非 NULL),但使用者又在前端將輸入控制項清空,再按儲存時,原本無法從前端直接存入 NULL (除非用 Parameter),
    // 此時會改存為我們自訂的數字 0 。
    // profiler 的結果: UPDATE trd_contract SET ExchangeRate=ISNULL(ExchangeRate,0)  WHERE ContractID=1

     

     

    或改用 SqlParameter 物件,可從前端,讓使用者清空輸入控制項、又按送出時,仍能寫入 null 至資料庫欄位。

    2008年2月3日 上午 11:50