数据集SSRS中的STRING_SPLIT函数替代方法是什么

时间:2018-10-16 04:17:18

标签: sql-server tsql reporting-services

  

DataSet:dsStudent(在报告中为下拉列表)

DECLARE @gid VARCHAR(36) = CONVERT(VARCHAR(36), NEWID());

SELECT CAST(StudentId AS VARCHAR(MAX))+@gid AS StudentId, StudentName
FROM dbo.Student1;
  

DataSet:dsStudentFilter(用于捕获从下拉列表中选择的数据)

SELECT StudentName
FROM Student1
WHERE StudentId IN
      (
          SELECT REPLACE(b.value('text()[1]', 'NVARCHAR(MAX)'), RIGHT(b.value('text()[1]', 'NVARCHAR(MAX)'), 36), '')
          FROM
          (
              VALUES
                  (CAST('<x>' + REPLACE(@StudentId, ',', '</x><x>') + '</x>' AS XML))
          ) A (a)
              CROSS APPLY a.nodes('/x') B(b)
      );

现在,当我预览报告时,我遇到以下错误:

enter image description here

报告设计:

enter image description here

在SSRS报告的dsStudentFilter数据集中,我想做以下事情:

DECLARE @StudentId VARCHAR(MAX)
= '1111112EE300718-79A4-4260-A5E9-22B7CA71998,1111122EE300718-79A4-4260-A5E9-22B7CA71998';
SELECT StudentName
FROM Student1
WHERE StudentId IN
  (
      SELECT value
      FROM STRING_SPLIT(REPLACE(@StudentId, RIGHT(@StudentId, 36), ''), ',')
  );

但是我不能在DataSet中使用STRING_SPLIT,还有其他选择吗?

表中的数据:

enter image description here

以上查询将显示Jay和Sam。

2 个答案:

答案 0 :(得分:1)

如果允许这样做,则可以在SQL Server上创建内联表值函数。另一个机会是使用存储过程并在动态SQL中创建IN子句...

或者您可以使用这种方法进行内联拆分:

DECLARE @StudentId VARCHAR(MAX) = '3,5,6,7';

SELECT o.*
FROM sys.objects o
WHERE o.object_id IN
  (
      SELECT b.value('text()[1]','int')
      FROM (VALUES(CAST('<x>' + REPLACE(@StudentId,',','</x><x>') + '</x>' AS XML)))A(a)
      CROSS APPLY a.nodes('/x') B(b)
  );

值列表从3,5,6,7传输到<x>3</x><x>5</x><x>6</x><x>7</x>,然后作为XML处理...

提示:

在您的示例中,您将必须在uniqueidentifier中使用int而不是.value()

答案 1 :(得分:0)

这是一种解决方法:

DECLARE @StudentId VARCHAR(MAX)
= '291540054631905-414A-4669-A941-E21ACB3C0912,291766154631905-414A-4669-A941-E21ACB3C0912';

SELECT StudentName
FROM Student
WHERE ',' + @StudentId + ',' LIKE '%,' + StudentId + ',%';

Demo

基本思想是直接在输入字符串中搜索给定的StudentId,两边用逗号分隔。在进行比较之前,我们将逗号添加到输入字符串的开头和结尾,以确保实际上每个StudentId始终由逗号分隔。