我有一個存儲過程,它執行一些參數驗證,如果參數無效,應該會失敗並停止執行。執行存儲過程參數驗證的「正確」方式
我的錯誤第一種方法檢查是這樣的:
create proc spBaz
(
@fooInt int = 0,
@fooString varchar(10) = null,
@barInt int = 0,
@barString varchar(10) = null
)
as
begin
if (@fooInt = 0 and (@fooString is null or @fooString = ''))
raiserror('invalid parameter: foo', 18, 0)
if (@barInt = 0 and (@barString is null or @barString = ''))
raiserror('invalid parameter: bar', 18, 0)
print 'validation succeeded'
-- do some work
end
這並沒有這樣的伎倆,因爲嚴重性18不停止執行和「驗證成功」與錯誤信息一起打印。
我知道我可以簡單地增加每RAISERROR後回報,但這個看起來有點醜對我說:
if (@fooInt = 0 and (@fooString is null or @fooString = ''))
begin
raiserror('invalid parameter: foo', 18, 0)
return
end
...
print 'validation succeeded'
-- do some work
由於嚴重性11錯誤和更高一個try/catch塊內抓我測試了另一種方法是封裝我的錯誤檢查裏面這樣一個try/catch塊。問題在於錯誤被吞噬了,根本沒有發送給客戶端。所以我做了一些研究,發現了一種rethrow錯誤:
我還是不滿意這種做法,所以我問你:
請問你的參數驗證樣子的?做這種檢查有沒有某種「最佳做法」?
是否有任何理由爲什麼你使用IF(ISNULL(@fooString,'')='')而不是IF(@fooString爲null)? – macleojw 2009-06-29 12:22:26
@macleojw:他同時檢查null和''..聰明:) – VVS 2009-06-29 12:23:31
第二個驗證程序的語法無效:'RAISEERROR'。應該只有一個'e'。有趣的是,在英語中它是正確的,因爲'raise + error'具有雙'e',但不是MS SQL語言。 – 2012-06-19 11:25:05