7

有没有办法为 SQL Server 创建一个 CLR 用户定义函数,它返回多个值而不使用表值函数语法?例如,假设我要执行坐标转换,例如:

[SqlFunction()]
public void ConvertCoordinates(SqlDouble x, SqlDouble y, SqlDouble z, out SqlDouble r, out SqlDouble t, out SqlDouble p)
{
   r = new SqlDouble(Math.Sqrt((x.Value*x.Value)+(y.Value*y.Value)+(z.Value*z.Value)));
   t = new SqlDouble(Math.Acos(r.Value / z.Value));
   p = new SqlDouble(Math.Atan(y.Value / x.Value));
}

这甚至可能吗?在这种情况下,表值函数似乎不合适,因为计算永远不会产生超过一个输出行。使用标量值函数语法,我必须编写三个不同的函数来执行计算并分别调用每个函数。鉴于我的实际用例,这是非常不切实际的。

我意识到上面的逻辑可以用纯T-SQL来完成;我的实际用例更复杂,但仍只会导致单行具有多个相互依赖的输出值。

那么,归根结底,可行吗?我不认为它是,但人们可以希望。如果碰巧它是可行的,那么调用这样一个函数的 T-SQL 会是什么样子?

4

3 回答 3

3

由于您已经尝试过 CLR,因此您可以创建自己的 CLR 类型,用它可以做各种疯狂的事情。作为一个实际的例子,原生空间类型以这种方式实现,就像 HierarchyID 一样。一旦你定义了你自己的类型,你就可以让你的函数返回它。如果获取单个组件(如果我可以假设您的情况是半径、theta 和 phi),请在返回此类的类型上创建方法。

于 2012-09-27T02:46:38.397 回答
1

这是一个较老的问题,我在寻找一个非常相似的问题的答案时发现了它。

SQL 函数允许返回值,但不允许使用输出参数。

SQL 过程确实允许输出参数(但不允许返回值)

我从这里的 MSDN 示例中找到了这个:

http://technet.microsoft.com/en-us/library/ms131092.aspx

 [Microsoft.SqlServer.Server.SqlProcedure]
 public static void PriceSum(out SqlInt32 value)
 { … }

CREATE PROCEDURE PriceSum (@sum int OUTPUT)
AS EXTERNAL NAME TestStoredProc.StoredProcedures.PriceSum

当我从尝试注册函数切换到过程时,一切都解决了。需要指出的是,函数可以有返回值,而存储过程不能。在我的情况下,我返回了一个字符串值,并为一些可选的详细信息(如状态代码等)提供了输出参数。我所做的只是将我的方法更改为 void 并将字符串值作为输出参数传回。

无论如何,您的方法都是 void 并且没有返回值,因此是使用存储过程而不是函数的完美候选者。

于 2013-10-16T17:09:52.127 回答
-1

我承认我没有尝试过,但我想 T-SQL 会喜欢,

DECLARE @X FLOAT(53),
        @Y FLOAT(53),
        @Z FLOAT(53),
        @R FLOAT(53),
        @T FLOAT(53),
        @P FLOAT(53)

EXEC    ConvertCoordinates
        @X = 0,
        @Y = 0,
        @Z = 0,
        @R = @R OUTPUT,
        @T = @T OUTPUT
        @P = @P OUTPUT
于 2012-09-26T21:23:38.173 回答