首页 > 解决方案 > DataSet SSRS 中的 STRING_SPLIT 函数替代方案是什么

问题描述

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)
      );

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

在此处输入图像描述

报告设计:

在此处输入图像描述

在 SSRS 报告的 dsStudentFilter DataSet 中,我想做如下的事情:

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 是否有其他选择?

表中数据:

在此处输入图像描述

上面的查询将显示 Jay 和 Sam。

标签: sql-servertsqlreporting-services

解决方案


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

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

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)
  );

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

暗示:

对于您的示例,您将不得不使用uniqueidentifier而不是intinside.value()


推荐阅读