Я пытаюсь написать 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, если приведение не выполнено, вместо ошибки?