這個是一個Vendor的應用程序報的錯誤。,單看這個錯誤原因很簡單,嘗試將NULL值插入到表,但是表不允許使用NULL值。
查到後面發現其實根本原因是字段的內容沒有按照當時的規定。按照要求,用戶輸入的需要包含’-’,但是用戶輸入的數據沒有這個字符,系統嘗試用”-”分隔數據的時候出現問題。
其實這個是應用程序設計的問題,在用戶輸入的時候根據規則驗證用戶的輸入,確保所有的數據都是合理的,這樣可以避免後續的問題。(如果不做驗證的話,除了業務邏輯的問題,還可能會導致SQL注入的問題)。
解決思路:除了在應用端做驗證,也可以用SQLServer Constraint。
下面舉個例子:
createtable test(namevarchar(10))
altertable testaddconstraintck_nameCHECK(charindex('-',name)>0)
如果我嘗試插入沒有”-”字符的數據會出現下面的錯誤:
insertinto testvalues ('4')
Msg 547, Level16, State 0, Line 1
The INSERTstatement conflicted with the CHECK constraint "ck_name". Theconflict occurred in database "master", table "dbo.test",column 'name'.
The statement has beenterminated.
有一點要注意保持事物的完整性,如果一次插入多條記錄,不用顯示事物的話可能會出現有些插入成功,有些失敗的情況。爲了保持完整性,可以用顯事物:
begintry
begintran
insertinto test values ('1-')
insertinto test values ('2-')
insertinto test values ('3-')
insertinto test values ('4')
insertinto test values ('5-')
committran
endtry
begincatch
rollbacktran
endcatch
這樣如果有一條記錄有問題就會回滾整個事務。Constraint還可以限制唯一值,外鍵,用正則表達式等,功能非常強大,數據輸入的時候做好驗證,可以避免後續很多的維護問題。