将存储过程重写为函数

此主题说明如何确定是否将现有存储过程逻辑重写为用户定义函数。例如,如果希望直接从查询中调用存储过程,可将代码重新打包为用户定义函数。

一般来说,如果存储过程返回单个结果集,则定义表值函数。如果存储过程计算标量值,则定义标量函数。

表值函数的条件

如果存储过程满足下列条件,则可以将其重写为表值函数:

  • 逻辑可以用单个 SELECT 语句表达,但它是存储过程而不是视图,只是由于需要参数。可以使用内联表值函数处理这种情况。

  • 存储过程不执行更新操作(除了对表变量以外)。

  • 不需要动态 EXECUTE 语句。

  • 存储过程返回一个结果集。

  • 存储过程的主要用途是生成要加载到临时表中的中间结果,然后在 SELECT 语句中查询临时表。可以使用表值函数编写 INSERT...EXEC 语句。例如,请看下面的序列:

    INSERT #temp EXEC sp_getresults
    SELECT ...
    FROM #temp, t1
    WHERE ...
    

    可将存储过程 sp_getresults 重写为表值函数,例如 fn_results(),这意味着可将上面的语句重写为:

    INSERT #temp
    SELECT ...
    FROM fn_results(), t1
    WHERE ...
    

使用 CLR 重写扩展存储过程

CLR 函数为扩展存储过程提供了一种更可靠和可伸缩的选择。很多扩展存储过程执行一些在 Transact-SQL 中难以表达的计算任务。这种存储过程可以使用 CLR 重写,并能得到上面介绍的好处。而且,通过访问外部资源(例如文件或 Web 服务)返回结果集的扩展存储过程可以使用 CLR 表值函数来重写。有关详细信息,请参阅创建 CLR 函数