在SSRS

时间:2018-08-27 15:08:16

标签: sql-server reporting-services ssrs-2008 ssrs-2008-r2

我正在使用拆分功能来分隔具有两个街道地址的列。

信息之间用,隔开。

某些行仅具有一个与之关联的地址。

在我的街道地址2的那些行中,当我希望将其设为#ERROR时得到null

我已经尝试过使用IIF()表达式来表达,但是我遇到了麻烦。

Split(Fields!Street.Value, ",").GetValue(2)

2 个答案:

答案 0 :(得分:1)

(对每个地址使用自定义功能。
改编自: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

答案 1 :(得分:0)

与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()用于查找字符串“,”在地址中的位置。如果找不到字符串,则返回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, ","))
    )
)

如果您有两个以上的逗号,则可以通过跟随一个查找第三个逗号位置的Left()函数,仅抓住第二个和第三个逗号之间的字符串。

现在,如果没有第二个逗号,则可以使用IIf()函数返回NULL(无)。顶部的功能显示了所有这些如何组合在一起。

这可以通过使用函数来清除,但是提供的代码向您展示了如何实现。