为啥标量值函数会因空参数而失败?
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,而实际上您传递的是空字符串、默认值或类似的东西。
【讨论】:
以上是关于为啥标量值函数会因空参数而失败?的主要内容,如果未能解决你的问题,请参考以下文章
套接字:为啥阻塞 read() 会因 ENOTCONN 而失败?
为啥 TextOutW() 会因自定义字体大于 131 像素而失败?