使用ref参数从dll程序集创建MS SQL Server函数



我想从C#库创建一个函数,该函数已作为程序集成功注册到MS SQL Server数据库中。函数在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

由于您似乎对DLL和函数都有控制权,您可以删除ErrorCode的ref参数,然后从方法中返回一个字符串,其中包含以下内容:

double|errorCode 

然后在SQL中,您可以拆分字符串结果,并在客户端将其强制转换为浮点值和int值。

(我知道有一种更有效的方法来写这篇文章,它更清楚地分解每一步(

Declare @StringResult nvarchar(50)
Declare @Result float
Declare @Delimiter nvarchar(1)
Declare @SeperateIndex int
Declare @ErrorCode int
Set @Delimiter = '|'
-- Example return value
Set @StringResult = '50|-1100'
Set @SeperateIndex = CharIndex(@Delimiter,@StringResult)
Set @Result = Convert(float,Substring(@StringResult,0,@SeperateIndex))
Set @ErrorCode = Convert(int, Substring(@StringResult, @SeperateIndex + 1, 
Len(@StringResult) - @SeperateIndex + 1))
Select @Result, @ErrorCode

在这个例子中,结果看起来像:

50  -1100

只是个主意。

最新更新