在SQL Server存储过程中的子例程

6

请问如何在SQL Server中创建存储过程的子程序?

我在Oracle中有一个存储过程,在该过程中调用了同一过程内的子程序达50次,而这些调用位于不同行。现在我想在SQL Server中重新创建该过程。你能否告诉我如何实现这个功能?


1
在SQL Server中并不存在子程序这样的东西。但是存储过程可以调用另一个存储过程。 - Dale K
2个回答

3
如果您的子例程正在执行数据修改(CRUD)或需要使用临时表(#teporary_table),则需要将其设置为存储过程。在其他情况下,您可以创建函数。根据其复杂性和返回值,可以从不同类型的函数中进行选择:
  • 标量函数 - 返回一个值
  • 内联表值 - 它类似于带有参数的视图(例如,您不能声明表变量,它是一个SELECT语句),并返回行集
  • 多语句表值 - 返回行集,但您可以有更复杂的逻辑
此外,在SQL Server中还有SQL CLR,您可以在.net代码中创建函数或过程(或称为“子例程”)。

1
在SQL Server中,您可以使用存储过程和表和标量函数。另一个方便的功能是公共表达式。
函数可以直接在SQL语句(SELECT、INSERT、UPDATE、JOIN)中使用,因此它们非常方便重复使用。
表函数:
SELECT *
FROM myFunction(@UserID) as f
    INNER JOIN users AS u ON f.UserID = u.ID

标量函数可以放在查询的SELECT部分。

SELECT u.ID, myFunction(u.ID)
FROM users as u

公共表达式对于可读性很好:

;WITH MyCTP AS
(
    // complex SQL
)
SELECT *
FROM myTable INNER JOIN MyCTP ON...

在SELECT语句之前,您可以有多个CTE,但只能在声明它们的语句中使用它们。

存储过程

它们有点麻烦,因为您需要将结果捕获到变量中,以便在调用存储过程中使用它们。

 DECLARE @Input INT
 DECLARE @Result INT

 EXEC myStoredProcedure @Input, @Result OUT

如果存储过程输出表格,情况会变得更加复杂。您需要使用游标来捕获结果。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接