我試圖寫一個UDF翻譯一個字符串,或者一個GUID或與該GUID到GUID關聯的項目代碼:在用戶定義的函數中嘗試捕捉?
CREATE FUNCTION fn_user_GetProjectID
(
@Project nvarchar(50)
)
RETURNS uniqueidentifier
AS
BEGIN
declare @ProjectID uniqueidentifier
BEGIN TRY
set @ProjectID = cast(@Project as uniqueidentifier)
END TRY
BEGIN CATCH
set @ProjectID = null
END CATCH
if(@ProjectID is null)
BEGIN
select @ProjectID = ProjectID from Project where projectcode = @Project
END
return @ProjectID
END
此工作正常,如果上面的代碼被嵌入在我的存儲程序,但我想從中做出一個功能,以便我遵循DRY。
當我嘗試創建功能,我得到這樣的錯誤:
Msg 443, Level 16, State 14, Procedure fn_user_GetProjectID, Line 16
Invalid use of side-effecting or time-dependent operator in 'BEGIN TRY' within a function.
有沒有人有一個想法,我怎樣才能解決這個問題?
編輯:我知道我不能在功能中使用Try-Catch,我想簡化的問題是,是否有一種方法可以執行強制轉換,如果強制轉換失敗而不是錯誤就會返回NULL ?
是使用SQLCLR的選擇嗎?如果是這樣,編寫您自己的SQLCLR函數將工作。 – 2010-07-09 05:05:46
SQLCLR絕對不是一種選擇。會更容易,是的。我最終使用了我的解決方案和8kb的組合。 – Moose 2010-07-09 13:25:29