如何创建从我的查询返回游标的用户定义函数

时间:2010-11-04 02:22:10

标签: sql-server tsql sql-server-2008

如何创建一个'用户定义的函数',从以下查询中将'游标'返回给用户:

SELECT 
   P.AddressId,
   P.DepartmentId
FROM
   Person P
INNER JOIN
   ACCOUNT A
ON p.UserId = A.UserId

我正在寻找一种用TSQL编写并与SS2008兼容的解决方案。标记为Id的任何列都是int类型。我们想将两列返回给调用者,而不仅仅是一个标量。我们打算调用该函数,并从该函数的结果中写出其他查询。

编辑: 根据StarShip3000,解决方案是返回一个表。我相信tsql:

CREATE FUNCTION nameOfFunction()
RETURNS @result TABLE
(
   AddressId INT,
   DeviceId INT
)
AS
BEGIN
INSERT INTO @result (AddressId, DeviceId)

SELECT 
   P.AddressId,
   P.DepartmentId
FROM
   Person P
INNER JOIN
   ACCOUNT A
ON p.UserId = A.UserId

RETURN
END

2 个答案:

答案 0 :(得分:4)

通过您尝试做的事情的声音,您可以通过将数据插入其中并在会话的调用堆栈中进一步向下引用该表来使用临时表。所以调用proc1(将行插入#MyTable) - > proc2(从#MyTable读取行) - > proc3等。

您的同事很可能来自Oracle商店,游标已经过优化并且实际上一直在使用,但在大多数情况下仍然不是理想的解决方案。在SQL Server中,游标通常被认为是恶魔,因为它们没有像Oracle那样进行优化。在SQL Server 2008及更高版本中,您还可以使用表值参数将数据集传入和传出过程。实际上,您总是可以使用会话范围的临时表来执行此操作。我在SQL Server 2012上并且还需要使用表值参数,因为临时表工作得很好,但我确信有些情况下后者可能工作相同或更好。

尽管在任何关系数据库中尽可能利用基于集合的逻辑并且避免任何需要您逐行循环的构造或设计,但这一点非常重要。虽然有可能是唯一的方法,但确保这是唯一的方法。

答案 1 :(得分:0)

我的问题是为什么你需要一个返回addressId和departmentId的函数?似乎太微不足道了,值得为它创建一个功能。在这种情况下,我无法看到函数如何有用。

你们是指意见而不是功能???

那么只需创建一个视图。

CREATE VIEW dbo.vw_proprietryInfo
AS
BEGIN
   SELECT 
      P.AddressId,
      P.DepartmentId
   FROM
      Person P
      INNER JOIN ACCOUNT A
         ON p.UserId = A.UserId
END