【问题标题】:SSRS: String concatenation with nullable stringsSSRS:可空字符串的字符串连接
【发布时间】:2015-04-17 19:39:11
【问题描述】:

SSRS 讨厌我。现在,这种感觉是相互的。

我正在尝试处理可能为空或不为空的字符串。我用的是VB的IIF语句;在对我收到的错误进行了一些搜索之后,我发现IIF 语句不会像您期望的大多数 if 语句那样短路。我通过将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 成员的问题。

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

【问题讨论】:

  • 为什么不在 SQL 中构建字符串?
  • @TabAlleman “值得注意的是,我可以在我们的 SQL 查询中执行此操作(我几乎要放弃并说什么),但字符串连接似乎会减慢查询速度。”跨度>

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


【解决方案1】:

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

.NET 框架 支持:4.5.2、4.5.1、4.5、4

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

可移植类库 支持:可移植类库

.NET 用于 Windows 应用商店应用 支持:Windows 8

.NET 用于 Windows Phone 应用程序 支持:Windows Phone 8.1、Windows Phone 8、Silverlight 8.1

【讨论】:

  • 就是这样。不幸的是,SSRS 不支持较新版本的 .NET,因此是一个遗留应用程序。
【解决方案2】:

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

方法一: 使用

SET CONCAT_NULL_YIELDS_NULL { ON | OFF } 

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

SET CONCAT_NULL_YIELDS_NULL OFF;

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

方法 2: 使用条件语句,我们可以使用 IF 条件或 Case 语句来检查要在连接查询中使用的字段的值是否为 Null。因此,如果条件成立,我们还可以为要连接的特定单元格分配一个字符串值。

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

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

我的选择合并() 理由如下
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

【讨论】:

    猜你喜欢
    • 2011-12-06
    • 1970-01-01
    • 2015-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-31
    • 2015-09-13
    • 1970-01-01
    相关资源
    最近更新 更多