在 SSRS 中使用拆分功能时在某些字段中出现“#ERROR”
Getting "#ERROR" in certain fields when using Split function in SSRS
我正在使用拆分函数来分隔包含两个街道地址的列。
信息以,
分隔。
有些行只有一个地址与之关联。
在我的街道地址 2 的那些行中,当我希望它是 null
.
时,我得到 #ERROR
我已经为表达式尝试了 IIF()
语句,但我遇到了问题。
Split(Fields!Street.Value, ",").GetValue(2)
与 If 语句不同,IIf 语句计算所有代码路径,即使只使用一个代码路径也是如此。这意味着未使用的代码路径中的错误会冒泡到 IIf 语句中的错误,从而阻止它正确执行。
要解决此问题,您需要使用在没有任何内容可拆分时不会抛出错误的函数。
下面是一个代码示例,可以满足您的要求:
=IIf(
InStr(
InStr(
Parameters!Street.Value
, ","
) + 1
,
Parameters!Street.Value
, ","
) = 0
, Nothing
, Right(
Parameters!Street.Value
, Parameters!Street.Value.ToString().Length - (
InStr(
InStr(
Parameters!Street.Value
, ","
) + 1
,
Parameters!Street.Value
, ","
)
)
)
)
我们来分解一下。
我结合使用了 InStr()、Right()、Length() 和 IIf() 函数来拆分字符串而不引发错误。
InStr() 用于查找字符串“,”在地址中的位置。如果找不到字符串,这 returns 0 而不是错误。
InStr(Parameters!Street.Value, ",")
由于您似乎在寻找拆分函数中的第二个逗号,因此您需要嵌套 InStr 函数。使用第一个逗号的位置作为开始位置来搜索第二个逗号。不要忘记 +1,否则您会再次找到第一个逗号。
InStr(InStr(Parameters!Street.Value, ",") + 1, Parameters!Street.Value, ",")
现在即使不存在逗号,您也可以找到第二个逗号而不会引发错误。
根据第二个逗号的位置,使用 Right() 函数抓取第二个逗号右侧的所有字符。由于 Right() 需要知道从结尾而不是从开头算起有多少个字符,因此您需要从字符串的 Length() 中减去逗号的位置。这有效地在逗号处拆分了字符串。
Right(
Parameters!Street.Value
, Parameters!Street.Value.ToString().Length - (
InStr(InStr(Parameters!Street.Value, ",") + 1, Parameters!Street.Value, ","))
)
)
如果您有 2 个以上的逗号,您可以通过 Left() 函数查找第三个逗号的位置,从而只获取第二个和第三个逗号之间的字符串。
如果没有第二个逗号,现在您可以使用 IIf() 函数 return NULL(无)。顶部的函数显示了这一切是如何组合在一起的。
这可以通过使用函数来清理,但提供的代码向您展示了如何完成。
(为每个地址使用自定义函数。
改编自:Split String
Public Function GetAddress1(ByVal a as String)
Dim b() as string
b=Split(a,",")
Dim str_1(b.Length) As String
Dim i As Integer
For i = 0 To b.Length - 1
str_1(i) = b(i).Split(",")(0)
Next
return str_1
End Function
Public Function GetAddress2 (ByVal a as String)
Dim b() as string
b=Split(a,",")
Dim str_1(b.Length) As String
Dim i As Integer
For i = 0 To b.Length - 1
str_1(i) = b(i).Split(",")(1)
Next
return str_1
End Function
我正在使用拆分函数来分隔包含两个街道地址的列。
信息以,
分隔。
有些行只有一个地址与之关联。
在我的街道地址 2 的那些行中,当我希望它是 null
.
#ERROR
我已经为表达式尝试了 IIF()
语句,但我遇到了问题。
Split(Fields!Street.Value, ",").GetValue(2)
与 If 语句不同,IIf 语句计算所有代码路径,即使只使用一个代码路径也是如此。这意味着未使用的代码路径中的错误会冒泡到 IIf 语句中的错误,从而阻止它正确执行。
要解决此问题,您需要使用在没有任何内容可拆分时不会抛出错误的函数。
下面是一个代码示例,可以满足您的要求:
=IIf(
InStr(
InStr(
Parameters!Street.Value
, ","
) + 1
,
Parameters!Street.Value
, ","
) = 0
, Nothing
, Right(
Parameters!Street.Value
, Parameters!Street.Value.ToString().Length - (
InStr(
InStr(
Parameters!Street.Value
, ","
) + 1
,
Parameters!Street.Value
, ","
)
)
)
)
我们来分解一下。
我结合使用了 InStr()、Right()、Length() 和 IIf() 函数来拆分字符串而不引发错误。
InStr() 用于查找字符串“,”在地址中的位置。如果找不到字符串,这 returns 0 而不是错误。
InStr(Parameters!Street.Value, ",")
由于您似乎在寻找拆分函数中的第二个逗号,因此您需要嵌套 InStr 函数。使用第一个逗号的位置作为开始位置来搜索第二个逗号。不要忘记 +1,否则您会再次找到第一个逗号。
InStr(InStr(Parameters!Street.Value, ",") + 1, Parameters!Street.Value, ",")
现在即使不存在逗号,您也可以找到第二个逗号而不会引发错误。
根据第二个逗号的位置,使用 Right() 函数抓取第二个逗号右侧的所有字符。由于 Right() 需要知道从结尾而不是从开头算起有多少个字符,因此您需要从字符串的 Length() 中减去逗号的位置。这有效地在逗号处拆分了字符串。
Right(
Parameters!Street.Value
, Parameters!Street.Value.ToString().Length - (
InStr(InStr(Parameters!Street.Value, ",") + 1, Parameters!Street.Value, ","))
)
)
如果您有 2 个以上的逗号,您可以通过 Left() 函数查找第三个逗号的位置,从而只获取第二个和第三个逗号之间的字符串。
如果没有第二个逗号,现在您可以使用 IIf() 函数 return NULL(无)。顶部的函数显示了这一切是如何组合在一起的。
这可以通过使用函数来清理,但提供的代码向您展示了如何完成。
(为每个地址使用自定义函数。
改编自:Split String
Public Function GetAddress1(ByVal a as String)
Dim b() as string
b=Split(a,",")
Dim str_1(b.Length) As String
Dim i As Integer
For i = 0 To b.Length - 1
str_1(i) = b(i).Split(",")(0)
Next
return str_1
End Function
Public Function GetAddress2 (ByVal a as String)
Dim b() as string
b=Split(a,",")
Dim str_1(b.Length) As String
Dim i As Integer
For i = 0 To b.Length - 1
str_1(i) = b(i).Split(",")(1)
Next
return str_1
End Function