-3

我以前问过这个问题,但没有解决方案。我使用以下数据集创建了一个多值过滤器。

SELECT PASS_M, ENTRY_DT, EXIT_DT, WORKED_HRS, ACCESS_LOCATION_X, IC_N, COMPANY_M,  CONSECUTIVE_D 
FROM TEMP_TARGET
WHERE (CONSECUTIVE_D >= @consecDays) AND (ENTRY_DT BETWEEN @startDate AND @endDate)               AND
(ACCESS_LOCATION_X LIKE @accessVar) AND
(IC_N LIKE @icVAr)  

如果 my 的值accessVar不使用通配符会相对容易,但我需要它。因此, 中可能有 5 个值accessVar

%(means all), 'At%', 'Bet%', 'Co%' and 'Dea%'

我无法将 In 运算符与通配符一起使用。其次,我可以将这种下拉过滤器设为可选吗?如果选择了第 n 个,则查询全部。

我还有什么其他选择?

4

1 回答 1

1

您想同时使用 LIKE 和多值参数,这是行不通的。但是,Reporting Services 使我们能够做几乎任何我们想做的事情。解决方案是使用自定义代码和表达式。首先,我们将您的 SQL 语句更改为表达式,如下所示:

="SELECT PASS_M, ENTRY_DT, EXIT_DT, WORKED_HRS, ACCESS_LOCATION_X, IC_N, "
&"COMPANY_M, CONSECUTIVE_D "
&"FROM TEMP_TARGET "
&"WHERE (CONSECUTIVE_D >= @consecDays) "
&"AND (ENTRY_DT BETWEEN @startDate AND @endDate) "
&"AND ((@accessvar IS NULL) OR (ACCESS_LOCATION_X LIKE @accessVar)) "
&"AND ((@icVar IS NULL) OR (IC_N LIKE @icVAr)) "

所以现在 SQL 语句实际上是一个字符串表达式,它将计算为一个将执行的 SQL 表达式。

接下来我们需要将您的多值参数转换为一系列LIKE语句,我们可以使用自定义代码来完成。将以下自定义代码添加到您的报告中(右键单击报告,选择属性并单击代码选项卡):

Function AccessLocations (ByVal parameter As Parameter) AS String
  Dim Result As String
  If parameter.IsMultiValue then
    Result = "AND ( " 
    For i as integer = 0 to parameter.Count-1 
      Result = Result + "(ACCESS_LOCATION LIKE '" + CStr(parameter.Value(i)) + "') OR "  
    Next 
    Result = Left(Result, Result.Length - 3) +") "
  Else 
    Result = "AND (ACCESS_LOCATION LIKE '" + CStr(parameter.Value) + "') "
  End If 

  Return Result
End Function

然后我们将此函数称为 SQL 语句的一部分:

Code.AccessLocations(Parameters!accessvar)

所以你的完整 SQL 是:

="SELECT PASS_M, ENTRY_DT, EXIT_DT, WORKED_HRS, ACCESS_LOCATION_X, IC_N, "
&"COMPANY_M, CONSECUTIVE_D "
&"FROM TEMP_TARGET "
&"WHERE (CONSECUTIVE_D >= @consecDays) "
&"AND (ENTRY_DT BETWEEN @startDate AND @endDate) "
& Code.AccessLocations(Parameters!accessvar)
&"AND ((@icVar IS NULL) OR (IC_N LIKE @icVAr)) "

如果您的参数中有%通配符,那么这将起作用;否则将通配符添加到函数中。

于 2012-12-17T01:31:54.307 回答