9

我想在SQL Server 2005中編寫一個非CLR用戶定義的函數。此函數接受一個輸入字符串並返回一個輸出字符串。如果輸入字符串無效,那麼我想向調用者指出一個錯誤。用戶定義函數中的錯誤處理

我的第一個想法是使用RAISERROR引發異常。但是,SQL Server在UDF內部不允許這樣做(儘管您可以在基於CLR的UDF中引發異常,請參閱圖)。

如果輸入值出錯,我最後的手段是從函數返回NULL(或其他錯誤指示​​符值)。不過,我不喜歡這個選項,因爲它:

  1. 不提供給調用者的任何有用的信息
  2. 不允許我以響應有效輸入返回NULL(因爲它的使用作爲錯誤代碼)。

是否有任何調用方便的方法來停止SQL Server中的錯誤函數?

回答

7

似乎SQL Server UDF在這個(以及其他)方面有點受限。

你真的不能對此做很多事 - 那就是(現在)就是這樣。要麼你可以定義你的UDF,這樣你就可以通過它的返回值(例如在發生錯誤時返回NULL)來發回錯誤條件,或者你幾乎不得不求助於編寫一個存儲過程,它可以有更多的錯誤處理,並允許RAISERROR等等。因此,要麼設計你的UDF不要求特定的錯誤條件信號,要麼你必須重新設計你的使用存儲過程的方法(它可以有多個OUTPUT參數,因此也可以返回錯誤代碼和你的數據有效載荷,如果你需要的話),或者爲你的UDF管理CLR代碼。

對不起,我沒有更好的主意 - 現在,我擔心,這些都是你的選擇 - 隨你選。

馬克

+0

我期待的很多,但我想我會問。謝謝。 – 2009-08-06 19:05:00

+1

sprocs的問題是你不能用函數的方式調用它們。 – 2013-01-08 19:17:18

+0

我同意@MikeK。我使用UDF而不是完整stored_procedure的全部原因是內聯使用。 在較新版本的SQL Server中是否更改了此問題的答案? (例如2016) – ColinMac 2017-09-18 21:29:07

1

有在回答中給出一個重複的問題here一個可能的解決方案,基於這一理念:

return cast('Error message here.' as int); 

會拋出這樣的事情:

Msg 245, Level 16, State 1, Line 1 
Conversion failed when converting the varchar value 'Error message here.' to data type int. 

它的工作原理確定標量值的UDF,但不適用於表值類型的UDF。

+0

我想可以在預期的表格中返回錯誤文本,是嗎? – ColinMac 2017-09-18 21:28:34