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数据集中,我想做以下事情:
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。
答案 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 + ',%';
基本思想是直接在输入字符串中搜索给定的StudentId
,两边用逗号分隔。在进行比较之前,我们将逗号添加到输入字符串的开头和结尾,以确保实际上每个StudentId
始终由逗号分隔。