Sql server 为什么标量值函数使用空参数失败?

Sql server 为什么标量值函数使用空参数失败?,sql-server,tsql,user-defined-functions,Sql Server,Tsql,User Defined Functions,在TSQL中,我需要从给定字段的值到指定客户机的值进行交叉引用。我们有许多客户机,每个客户机的值编码都不同。数据库是CRM Dynamics 2011数据库 我设置了一个标量值函数,如下所示: [dbo].[fn_GetXRef] (@Guid uniqueidentifier, @LookupType nvarchar(20), @OurValue nvarchar(20), @Parm4 nvarchar(20) = null, @Parm5 uniqueidentifier =

在TSQL中,我需要从给定字段的值到指定客户机的值进行交叉引用。我们有许多客户机,每个客户机的值编码都不同。数据库是CRM Dynamics 2011数据库

我设置了一个标量值函数,如下所示:

 [dbo].[fn_GetXRef] 
(@Guid uniqueidentifier, @LookupType nvarchar(20), 
 @OurValue nvarchar(20), @Parm4 nvarchar(20) = null,
 @Parm5 uniqueidentifier = null, @Parm6 nvarchar(1) = null,
 @Parm7 nvarchar(1) = null) 
PARM 4、5、6和7可以为空;它们用于某些交叉引用,但不用于其他引用

如果我在函数外部运行execute逻辑,它就会工作。当我执行该函数时,它返回NULL

例如:

Select dbo.fn_getXRef('22BF20B1-55F1-E211-BF73-00155D062F00',
                            'Lookup Type 1', 'Our value', null,  null, null, '3')
返回null,但从函数中提取逻辑并将其作为单独的查询运行,并使用相同的输入参数值返回正确的客户机值

我没有看到什么

更新:12/11/13

谢谢大家的帮助。在研究过程中,我发现了一些漂亮的代码,看起来比我自己的代码更有效,所以我用这种技术重新编写了函数,现在它可以工作了。它使用选项“重新编译”:

选择@TheirValue=X.carriervalue 来自dbo.Filteredcrossreference X 哪里 X.carrier=@CarrierId 和X.lookuptype=@lookuptype 和X.ourvalue=@ourvalue 并且@Parm4为NULL或X.Parm4=@Parm4 并且@Parm5为NULL或X.Parm5=@Parm5 并且@Parm6为NULL或X.Parm6=@Parm6
选项重新编译

很难说,没有看到函数的主体。但一个常见的地方是看PARM实际上是通过了什么。很有可能,当您实际传递的是空字符串、默认值或类似的内容时,您可能会认为您传递的是null。

您可以向我们展示UDF的主体吗?您可以共享函数[dbo].[fn_GetXRef]的部分代码吗?或者解释它应该做什么?为什么要隐藏函数的重要部分,只向我们显示参数列表?我们不擅长读心术。