在我的数据集中,我有两个包含字符串的字段 X 和 Y,但有时 Y 为空。字符串的结构如下“(可变长度代码)代码描述”eks:
(ab1234) some event
我希望大部分时间都使用 Y,但是当 Y 为空时我需要使用 X,并且我一直在尝试使用此代码。
=IIF(isNothing(Fields!Y.Value),
Split(Fields!X.Value,")").GetValue(1),
Split(Fields!Y.Value,")").GetValue(1)
)
当 Y 不为空时,这工作得很好,但在这种情况下,它是提交的回报
#ERROR
我已经尝试了很多东西来规避这个问题,但只要 Split(Fields!Y.Value,")").GetValue(1)
行存在,它就会中断。谁能告诉我这是为什么,以及解决这个问题的有效方法。
这将按预期返回
=IIF(isNothing(Fields!Y.Value),
1,
0
)
这将按预期返回
=IIF(isNothing(Fields!Y.Value),
Split(Fields!X.Value,")").GetValue(1),
0
)
这将返回 #ERROR 而不是 1
=IIF(isNothing(Fields!Y.Value),
1,
Split(Fields!Y.Value,")").GetValue(1)
)
同上
=IIF(NOT isNothing(Fields!Y.Value),
Split(Fields!Y.Value,")").GetValue(1),
1
)
MID 字符串命令可以工作,但由于可变长度代码,结果很混乱
您的表达式的问题是 IIF 的两个部分都被评估,即使它们没有返回。因此,当 Y 为 NULL 时,SSRS 仍然尝试评估 SPLIT() ,它将返回空数组,然后 GetValue(1) 尝试返回第二个元素,该元素不存在。
解决此问题的最简单方法是在评估字符串时在字符串末尾添加“)”。结果永远不会返回,所以没关系。
所以..
=IIF(
IsNothing(Fields!Y.Value)
, Split(Fields!X.Value & ")", ")").GetValue(1)
, Split(Fields!Y.Value & ")", ")").GetValue(1)
)
将解决该问题。
当评估 SPLIT 时,将 Y 指定为“(ab1234) some event”将会拆分字符串
"(ab1234) some event)"
,但仍返回第一个元素 " some event"
。当 NULL 值被求值时,它将尝试分割字符串")"
而不是 NULL 并返回一个空字符串,我们实际上从未返回这个值,但该函数可以返回一个有效值,这就是我们所需要的。
基于我在示例中使用的以下数据集..
DECLARE @t TABLE(X varchar(100), Y varchar(100))
INSERT INTO @t VALUES
('(ab1234) some event R1X', '(ab1234) some event R1Y'),
(NULL, '(xy9876) some other event R2Y'),
('(zz999) final event R3X', NULL)
SELECT * FROM @t
这些是结果。