【发布时间】:2020-06-11 12:40:21
【问题描述】:
我想从已成功注册到 MS SQL Server 数据库中的 C# 库作为程序集创建一个函数。该函数在 C# 中的签名如下所示:
public static double DensityD11162Relative(double observedDensity,
double observedTemperature,
double observedPressure,
ref int errorCode)
为了在 SQL Server 中使用此函数,我尝试按如下方式创建函数:
CREATE FUNCTION DensityD11162Relative(@observedDensity float,
@observedTemperature float,
@observedPressure float,
@errorCode int)
RETURNS float
AS
EXTERNAL NAME [Flowcal.ApiVcfLibrary].[Flowcal.ApiVcfLibrary.Customary.Original.Lubricants].DensityD11162Relative
但是,这会导致以下错误消息:
Msg 6580, Level 16, State 1, Procedure DensityD11162Relative, Line 3 [Batch Start Line 0]
Declarations do not match for parameter 4. .NET Framework reference and T-SQL OUTPUT parameter declarations must match.
Msg 6552, Level 16, State 3, Procedure DensityD11162Relative, Line 3 [Batch Start Line 0]
CREATE FUNCTION for "DensityD11162Relative" failed because T-SQL and CLR types for parameter "@errorCode" do not match.
消息指出第四个参数的类型错误,这是有道理的,因为 C# 签名表明它需要一个 ref int 参数。
我的问题是:从程序集创建 SQL 函数时,我可以传递 ref 参数(或占位符)吗?如果是这样,怎么做?如果没有,是否有任何方法可以在不使用 C# 编写包装器的情况下解决此问题?
我使用的是 SQL Server 2017
【问题讨论】:
-
您大概应该将其声明为
@errorCode int OUTPUT以允许对其进行与 by-ref 类似的处理。 -
不幸的是,这是不允许的:消息 181,级别 15,状态 1,过程 DensityD11162Relative,第 6 行 [Batch Start Line 0] 无法在 DECLARE、CREATE AGGREGATE 或 CREATE FUNCTION 语句中使用 OUTPUT 选项。
-
函数不能有输出参数。所以你知道答案了——你不能直接把它作为一个函数来实现。
-
太糟糕了,我想我们将不得不编写一个包装器。谢谢大家的帮助。
标签: c# sql sql-server clr sql-function