Какой будет альтернатива функции STRING_SPLIT в DataSet SSRS? - PullRequest
0 голосов
/ 16 октября 2018

DataSet: dsStudent (это DropDown в отчете)

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

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

DataSet: dsStudentFilter (используется для захвата данных, выбранных из DropDown)

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

В dsStudentFilter DataSet отчета SSRS я хочу сделать что-то вроде следующего:

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

Но я не могу использовать STRING_SPLIT в DataSet, есть ли какая-либо альтернатива, чтобы сделатьтак?

Данные в таблице:

enter image description here

Над запросом отобразятся Джей и Сэм.

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

Если вам разрешено это сделать, вы можете создать встроенную табличную функцию на SQL-сервере.Другой шанс состоял в том, чтобы использовать хранимую процедуру и создать IN -классу в dyanmic SQL ...

. Или вы можете использовать этот подход для разделения строк:

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

0 голосов
/ 16 октября 2018

Вот один из обходных путей:

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

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

Демо

Основная идея заключается в поиске данного StudentId непосредственно ввходная строка, разделенная запятыми с обеих сторон.Мы добавляем запятые к самому началу и концу входной строки перед сравнением, чтобы гарантировать, что каждый StudentId фактически всегда разделен запятыми.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...