为什么标量值函数会因null参数而失败?

时间:2013-11-27 21:52:59

标签: sql-server tsql user-defined-functions

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

我设置了一个像这样的标量值函数:

 [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) 

Parms 4,5,6和7可以为空;它们用于某些交叉引用而不是其他交叉引用。

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

例如:

Select dbo.fn_getXRef('22BF20B1-55F1-E211-BF73-00155D062F00',
                            'Lookup Type 1', 'Our value', null,  null, null, '3')

返回null但将逻辑拉出函数并将其作为单独的查询运行,并使用相同的输入参数值返回正确的客户端值。

我没看到什么?


更新:12/11/13

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

SELECT @TheirValue = X.carriervalue         来自dbo.Filteredcrossreference X.         哪里         X.carrier = @CarrierId         和X.lookuptype = @LookupType         和X.ourvalue = @OurValue         和(@ Parm4 IS NULL OR(X.parm4 = @ Parm4))                     和(@ Parm5 IS NULL OR(X.parm5 = @ Parm5))                     和(@ Parm6 IS NULL OR(X.parm6 = @ Parm6))         选项(重建)

1 个答案:

答案 0 :(得分:0)

很难说,没有看到你的功能的身体。但是,一个常见的地方将是实际传递的parms。有可能,你可能认为你传递的是null,实际上你传递的是一个空字符串,或者是一个默认值,或者沿着这些行传递的东西。