为啥标量值函数会因空参数而失败?

Posted

技术标签:

【中文标题】为啥标量值函数会因空参数而失败?【英文标题】:Why does scalar-value function fail with null parameter?为什么标量值函数会因空参数而失败? 【发布时间】:2013-11-27 21:52:59 【问题描述】:

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

参数 4、5、6 和 7 可以为空;它们用于某些交叉引用,但不用于其他。

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

例如:

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

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

我没看到什么?


更新:2013 年 12 月 11 日

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

选择@TheirValue = X.carriervalue FROM dbo.Filteredcros-s-reference X 在哪里 X.carrier = @CarrierId 和 X.lookuptype = @LookupType 和 X.ourvalue = @OurValue 和(@Parm4 为空或(X.parm4 = @Parm4)) 和 (@Parm5 为 NULL 或 (X.parm5 = @Parm5)) 和 (@Parm6 为 NULL 或 (X.parm6 = @Parm6)) 选项(重新编译)

【问题讨论】:

你能告诉我们UDF的主体吗? 你能分享(部分)函数[dbo].[fn_GetXRef]的代码吗?或者解释一下它应该做什么? 为什么隐藏函数的重要部分,只显示参数列表?我们不擅长读心。 【参考方案1】:

很难说,没有看到你的函数的主体。但一个常见的地方是查看实际传递的参数。很有可能,您可能认为您传递的是 null,而实际上您传递的是空字符串、默认值或类似的东西。

【讨论】:

以上是关于为啥标量值函数会因空参数而失败?的主要内容,如果未能解决你的问题,请参考以下文章

SQL 查询因空结果而失败

为啥 sed 会因国际字符而失败以及如何解决?

套接字:为啥阻塞 read() 会因 ENOTCONN 而失败?

为啥 TextOutW() 会因自定义字体大于 131 像素而失败?

为啥 spark-xml 会因 NoSuchMethodError 与 Spark 2.0.0 依赖关系而失败?

ArtifactoryPublish 因空指针异常而失败