我想从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
只是个主意。