3

我创建了两个数据集。

Dataset1(来自存储过程):

CREATE PROCEDURE [dbo].[usp_GetPerson](
@Category varchar(20))
AS

BEGIN
SELECT  FirstName, LastName, Category                   
FROM    tblPerson 
WHERE   (Category IN (@Category))

END

数据集2:

SELECT DISTINCT Category
FROM   tblPerson

在 SSRS 中,我编辑了参数以允许多个值并从 Dataset2 中提取可用值。

我已经尝试仅基于 Dataset1 进行过滤,但接收到所有重复的输入(这就是我选择使用数据集 2 的原因)。

当我使用存储过程时,我似乎无法选择多个值。我只能选择单个值,否则报告将变为空白。

所以我重新创建了Dataset1,但没有使用存储过程。相反,我只是在文本编辑器中编写了 SQL 语句,并且能够很好地选择多个值。

有谁知道为什么会发生这种情况并可以帮助我解决这个问题?

注意:当我的 SQL 语句变得更加复杂时,我将使用存储过程来连接多个数据库。我尝试在 SSRS 中执行此操作,但使用存储过程要快得多。

谢谢!

4

3 回答 3

3

使用这样的查询从 SP 运行时的问题:

SELECT  FirstName, LastName, Category                   
FROM    tblPerson 
WHERE   (Category IN (@Category))

@Category类似的东西在哪里'Cat1,Cat2,Cat3'

是该IN子句被@Category视为单个字符串,即一个单个值,而不是一组多个值,因此很可能永远不会匹配任何内容。

这就是为什么当你只有一个值时它可以工作 - 类似的东西'Cat1'会正确匹配一个或多个行。

当在报告本身中作为嵌入式查询运行时,SSRS 本质上会将其视为一段动态 T-SQL,这意味着字符串@Category会按原样添加到主查询中并正常工作。

因此,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)))

有多种方法可以获取从分隔字符串返回的集合。

有关许多拆分选项,请参阅 SO 问题。

或者来自Erland Sommarskog的权威文章。

选择你最喜欢的那个,然后从那里开始。

于 2013-09-14T01:07:26.203 回答
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)
于 2013-09-18T16:53:44.963 回答
0

您只能将 IN 与在查询中定义的静态一起使用。在这种情况下使用 =

CREATE PROCEDURE [dbo].[usp_GetPerson](
@Category varchar(20))
AS
BEGIN
   SELECT  FirstName, LastName, Category                   
   FROM    tblPerson 
   WHERE   (Category = @Category)
于 2013-09-13T23:45:15.920 回答