【发布时间】:2011-03-13 11:35:35
【问题描述】:
我正在尝试编写一个 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 函数就可以了。
-
SQLCLR 绝对不是一个选项。会容易得多,是的。我最终使用了我的解决方案和 8kb 的组合。
标签: tsql user-defined-functions