SSRS:可空字符串的字符串连接
SSRS: String concatenation with nullable strings
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 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 查询中执行此操作(我几乎要放弃并说什么)但是字符串连接似乎会稍微减慢查询速度。
在项目中为 .net 设置正确的版本 - 不支持早期版本。
.NET 框架
支持于:4.5.2、4.5.1、4.5、4
.NET Framework 客户端配置文件
支持:4
便携式Class图书馆
受支持:便携式 Class 库
.NET 用于 Windows 商店应用
支持于:Windows 8
.NET 用于 Windows Phone 个应用程序
支持于:Windows Phone 8.1,Windows Phone 8,Silverlight 8.1
在 SSRS 中出现与空值字符串连接相关的问题很常见。特别是在 UAT 会话之后,由于数据库中有数据而报告中的单元格为空。有不同的方法来解决这个问题。我将列出这些方法,选择我最喜欢的并陈述我的推理。
方法一:
使用
SET CONCAT_NULL_YIELDS_NULL { ON | OFF }
设置。它控制连接结果是否被视为 null 或空字符串值。
通过将设置更改为 OFF
SET CONCAT_NULL_YIELDS_NULL OFF;
您可以将字符串值与 null 或空值连接,并且 return 如果您用于连接的任何字段中有字符串值,则可以连接非 null 的值。
方法二:
使用 Conditional Statements,我们可以使用 IF 条件或 Case Statements 来检查连接查询中要使用的字段的值是否为 Null。因此,如果条件为真,我们还可以为要连接的特定单元格分配一个字符串值。
方法三:
使用 ISNULL() 和 COALESCE() 等系统函数。
ISNULL ( check_expression , replacement_value )
COALESCE ( expression [ ,...n ] )
我的选择合并()
理由如下
1- 尽管更改设置是最简单且最具成本效益的方法。在大多数公司中,更改设置不是由开发人员决定的,或者您在 tsql 对象中所做的更改甚至可能被具有更高权限的系统管理员撤销。
2- 即使您获得批准 Microsoft 已宣布仅在未来的升级中将此功能设置为 'ON',因此不建议继续使用此设置。检查 link
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
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 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 查询中执行此操作(我几乎要放弃并说什么)但是字符串连接似乎会稍微减慢查询速度。
在项目中为 .net 设置正确的版本 - 不支持早期版本。
.NET 框架 支持于:4.5.2、4.5.1、4.5、4
.NET Framework 客户端配置文件 支持:4
便携式Class图书馆 受支持:便携式 Class 库
.NET 用于 Windows 商店应用 支持于:Windows 8
.NET 用于 Windows Phone 个应用程序 支持于:Windows Phone 8.1,Windows Phone 8,Silverlight 8.1
在 SSRS 中出现与空值字符串连接相关的问题很常见。特别是在 UAT 会话之后,由于数据库中有数据而报告中的单元格为空。有不同的方法来解决这个问题。我将列出这些方法,选择我最喜欢的并陈述我的推理。
方法一: 使用
SET CONCAT_NULL_YIELDS_NULL { ON | OFF }
设置。它控制连接结果是否被视为 null 或空字符串值。 通过将设置更改为 OFF
SET CONCAT_NULL_YIELDS_NULL OFF;
您可以将字符串值与 null 或空值连接,并且 return 如果您用于连接的任何字段中有字符串值,则可以连接非 null 的值。
方法二: 使用 Conditional Statements,我们可以使用 IF 条件或 Case Statements 来检查连接查询中要使用的字段的值是否为 Null。因此,如果条件为真,我们还可以为要连接的特定单元格分配一个字符串值。
方法三: 使用 ISNULL() 和 COALESCE() 等系统函数。
ISNULL ( check_expression , replacement_value )
COALESCE ( expression [ ,...n ] )
我的选择合并()
理由如下
1- 尽管更改设置是最简单且最具成本效益的方法。在大多数公司中,更改设置不是由开发人员决定的,或者您在 tsql 对象中所做的更改甚至可能被具有更高权限的系统管理员撤销。
2- 即使您获得批准 Microsoft 已宣布仅在未来的升级中将此功能设置为 'ON',因此不建议继续使用此设置。检查 link
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