我创建了两个数据集。
Dataset1(来自存储过程):
CREATE PROCEDURE [dbo].[usp_GetPerson](
@Category varchar(20))
AS
BEGIN
SELECT FirstName, LastName, Category
FROM tblPerson
WHERE (Category IN (@Category))
END
Dataset2:
SELECT DISTINCT Category
FROM tblPerson
在SSRS中,我编辑了参数以允许多个值并从Dataset2中提取可用值。
我尝试过基于Dataset1的过滤,但接收所有重复的输入(这就是我选择使用数据集2的原因)。
当我使用存储过程时,我似乎无法选择多个值。我只能选择单个值,否则报告将变为空白。
所以我重新创建了Dataset1,但没有使用存储过程。相反,我只是在文本编辑器中编写了SQL语句,并且我能够很好地选择多个值。
有谁知道为什么会这样,可以帮我解决这个问题?
注意:我正在使用存储过程来处理我的SQL语句变得更加复杂,我将加入多个数据库。我尝试在SSRS中这样做,但使用存储过程要快得多。
谢谢!
答案 0 :(得分:3)
使用如下查询从SP运行时的问题:
SELECT FirstName, LastName, Category
FROM tblPerson
WHERE (Category IN (@Category))
其中@Category
类似于'Cat1,Cat2,Cat3'
是IN
子句将@Category
视为单个字符串,即一个单独的值,而不是一组多个值,因此很可能永远不会匹配任何内容。
这就是为什么当你只有一个值时它会工作 - 像'Cat1'
这样的东西会正确匹配一行或多行。
当在报表本身作为嵌入式查询运行时,SSRS基本上将其视为动态T-SQL的一部分,这意味着字符串@Category
将被写入主查询中并且正常工作。< / p>
因此,SP有几个选项。
您可以在SP中运行动态T-SQL,例如:
DECLARE @Query NVARCHAR(max) = N'SELECT FirstName, LastName, Category
FROM tblPerson
WHERE (Category IN (' + @Category + ))'
EXEC @Query
动态T-SQL很少是理想的,所以另一个选项是将@Category
变成一个用于查询的集合,通常使用一个函数来拆分字符串并返回一个表,它看起来像:
SELECT FirstName, LastName, Category
FROM tblPerson
WHERE (Category IN (SELECT values from dbo.SplitString(@Category)))
可以通过多种方式获取从分隔字符串返回的集合。
请参阅many split options的SO问题。
来自Erland Sommarskog的权威文章。
选择你最喜欢的那个并从那里开始。
答案 1 :(得分:0)
您只能在查询中定义静态时使用IN。在这个cas use =
CREATE PROCEDURE [dbo].[usp_GetPerson](
@Category varchar(20))
AS
BEGIN
SELECT FirstName, LastName, Category
FROM tblPerson
WHERE (Category = @Category)
答案 2 :(得分:0)
- 在互联网的某个地方找到这个功能 - 不记得在哪里
CREATE FUNCTION [dbo].[SplitString] ( @stringToSplit VARCHAR(MAX) )
RETURNS
@returnList TABLE ([Name] [nvarchar] (500))
AS
BEGIN
DECLARE @name NVARCHAR(255)
DECLARE @pos INT
WHILE CHARINDEX(',', @stringToSplit) > 0
BEGIN
SELECT @pos = CHARINDEX(',', @stringToSplit)
SELECT @name = SUBSTRING(@stringToSplit, 1, @pos-1)
INSERT INTO @returnList
SELECT @name
SELECT @stringToSplit = SUBSTRING(@stringToSplit, @pos+1, LEN(@stringToSplit)-@pos)
END
INSERT INTO @returnList
SELECT @stringToSplit
RETURN
END
- 来自报告的SP输入参数
@CarIds varchar(100)
CREATE Table #CarsTable(CarID varCHAR(10))
INSERT #CarsTable
SELECT LTRIM(Name) FROM dbo.SplitString(@carIds)
然后,对于您的查询,您会说...
WHErE CarsOwned IN (SELECT CarId FROM #CarsTable)