0

我有一个客户想要将值列表放入 Reporting Services 中的参数中,将其与她数据库中的表进行比较,然后在下一个字段中返回值的完整列表,并在下一个字段中以是或否表示该值是否在数据库表。例如,如果她的列表是 Duck、Horse、Chicken,并且表中只存在 Duck,她希望结果如下所示:

Duck    Yes 
Horse   No 
Chicken No

她不想只返回那些匹配的值,所以一个简单WHERE Animal IN (@ReportParameter1)的不会这样做。

我可以为这样的单个值参数工作:

DECLARE @FarmAnimals AS TABLE (Animal varchar(50))

INSERT INTO @FarmAnimals VALUES (@ReportParameter1)

SELECT Animal
   ,'In Barnyard’ = CASE WHEN EXISTS
    (SELECT * 
    FROM tblBarnyard
    WHERE BarnyardAnimal = Animal)
    THEN 'Yes'
    ELSE 'No'
    END

FROM @FarmAnimals

但是是否可以遍历未指定长度的多值参数并为每个单独的值创建一个 INSERT INTO 语句?如果这是不可能的,我很高兴告诉她这是不可能的,但我想不出有什么时候我发现 SQL 中的某些东西是不可能的。

4

2 回答 2

1

在 SQL 中不需要这样做,您只需编写自定义代码函数来遍历选定的参数值以获得您想要的结果。

Report菜单上,访问Report Properties...并选择Code选项卡。插入以下代码:

Function IsFieldSelected (fieldValue as String, ByVal parameter As Parameter) As String
  Dim Result As String
  Result = "No"
  If parameter.IsMultiValue Then
    For i As integer = 0 To parameter.Count-1 
      If (fieldValue = parameter.Value(i)) Then
          Result = "Yes"
      End If
    Next 
  Else 
      If (fieldValue = parameter.Value) Then
          Result = "Yes"
      End If
  End If 

  Return Result
End Function

然后在您希望“是/否”访问结果的单元格中使用此表达式:

=Code.IsFieldSelected(Fields!MyField.Value, Parameters!MyParameter)

请注意,您在这里传递的是参数对象,而不是 Value 属性(所以不要放在.Value最后)。我们在自定义代码函数中访问参数对象的 Value 属性,并将其与传递的字段值进行比较。

这适用于单值和多值参数。

于 2019-08-06T01:44:01.890 回答
0

您可以使用 SQL Server 中的 STRING_SPLIT 函数来执行此操作。

--Placeholder table
DECLARE @ExistingValuesInTable TABLE (Val VARCHAR(255)) ;
INSERT INTO @ExistingValuesInTable (Val) VALUES ('Duck') ;
--
DECLARE @UserInput VARCHAR(255) = 'Duck, Horse, Chicken' ;
SELECT  ss.value,
        CASE WHEN evit.Val IS NULL THEN 'No' ELSE 'Yes' END AS AlreadyExists
FROM  STRING_SPLIT(@UserInput, ',') AS ss
  LEFT OUTER JOIN @ExistingValuesInTable AS evit ON ss.value = evit.Val ;
于 2019-08-07T22:22:38.043 回答