SSRS:与可空字符串串联的字符串

时间:2015-04-17 19:39:12

标签: sql-server vb.net reporting-services

SSRS恨我。现在,感觉是相互的。

我尝试使用可能为null但可能不为null的字符串。我正在使用VB的IIF声明;在对我收到的错误进行了一些搜索之后,我发现IIF语句并没有像你所说的那样短路你所期望的方式。我通过将IIF语句更改为If来修复此问题。思想很好。

直到我遇到引用here的问题。

所以我被卡住了。我试图将所有内容放在报告代码块中,以为我可以将自己与我遇到的问题隔离开来,如下所示:

Public Function DisplayUserName(ByVal UserName As String, ByVal FirstName As  String, ByVal MiddleName As String, ByVal LastName As String) As String
    'SSRS sucks. Specifically, with empty strings and if statements that aren't IIF. Hence the code block.
    'See https://stackoverflow.com/q/27418185/677526. Unfortunately IIF can't work here.
    Dim result As New System.Text.StringBuilder()

    If Not System.String.IsNullOrWhitespace(UserName) Then
        result.Append(UserName)
        result.Append(VbCrLf)
    End If

    If Not System.String.IsNullOrWhitespace(FirstName) Then
        result.Append(FirstName)
        result.Append(" ")
    End If

    If Not System.String.IsNullOrWhitespace(MiddleName) Then
        result.Append(GetChar(MiddleName, 1))
        result.Append(". ")
    End If

    If Not System.String.IsNullOrWhitespace(LastName) Then
        result.Append(LastName)
    End If

    Return result.ToString()
End Function

...但现在我遇到IsNullOrWhitespace未成为System.String成员的问题。

我在这里几乎不知所措,因为我正在与我的工具作斗争。有没有人在尝试连接一组可以为null的字符串之前遇到过这种情况?你是怎么解决这个问题的?值得注意的是,我可以在我们的SQL查询中执行此操作(我几乎要放弃并说出任何内容),但字符串连接似乎会使查询有所缓慢。

2 个答案:

答案 0 :(得分:0)

在项目中为.net设置正确的版本 - 对于早期版本,它不受支持。

.NET Framework 受以下支持:4.5.2,4.5.1,4.5,4

.NET Framework客户端配置文件 支持:4

便携式类库 受以下版本支持:可移植类库

.NET for Windows Store应用程序 受以下版本支持:Windows 8

.NET for Windows Phone应用程序 受以下版本支持:Windows Phone 8.1,Windows Phone 8,Silverlight 8.1

答案 1 :(得分:0)

通常会出现与SSRS中的Null值相关的字符串连接相关的问题。特别是在UAT会话之后,由于数据库中存在数据而报告中有空单元格。有不同的方法来解决这个问题。我将列出方法,选择我最喜欢的并说明我的推理。

方法1:  使用

SET CONCAT_NULL_YIELDS_NULL { ON | OFF } 

设置。它控制是否将连接结果视为空值或空字符串值。 通过将设置更改为OFF

SET CONCAT_NULL_YIELDS_NULL OFF;

如果在用于连接的任何字段中存在字符串值,则可以将字符串值与null或空值连接,并返回null以外的值。

方法2: 使用条件语句,我们可以使用IF条件或案例语句来检查要在串联查询中使用的字段的值是否为空。因此,如果条件结果为真,我们还可以将字符串值分配给要连接的特定单元格。

方法3: 使用系统函数,如ISNULL()和COALESCE()。

ISNULL ( check_expression , replacement_value )
COALESCE ( expression [ ,...n ] )

MY PICK COALESCE() 如下所示的理由
1-即使更改设置是简单方法和最具成本效益的方法。在大多数公司中,开发人员无需更改设置,或者您在tsql对象中所做的更改甚至可能被具有更高权限的系统管理员撤消。 2-即使您获得批准,Microsoft也已宣布此功能将设置为“开启”。仅在将来的升级中,因此不建议在此设置上进行中继。检查链接 https://msdn.microsoft.com/en-us/library/ms176056.aspx 3 - 为什么在系统功能完成工作时编写自定义代码 4-我更喜欢使用COALESCE()而不是ISNULL()来包装每个字段,因为可以灵活地添加n个要比较的字段。

示例

SELECT 
EgField1,
EgField2,
COALESCE(Person.FName,'FNameNotAvialable') +    
COALESCE(Person.LName,'LNameNotAvialable') AS [FULL NAME]
FROM Person.Person