在存储过程中使用SSRS中的多个参数返回空白

时间:2013-09-13 23:36:54

标签: sql stored-procedures reporting-services parameters sql-server-2012

我创建了两个数据集。

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中这样做,但使用存储过程要快得多。

谢谢!

3 个答案:

答案 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)