SSRS报告,带有从数据库定义的动态查询参数

时间:2013-11-21 20:26:42

标签: sql-server reporting-services dynamic-sql

我的总体目标是制作一份SSRS 2012报告,显示不同团队中工人的指标。另外,我想有一些自定义下拉列表(每个团队可自定义),只显示特定的工作人员。

例如,我有2个项目 - Project1和Project2。 Project1希望下拉选项允许他们在旧金山和纽约队展示他们的工作人员。 Project2想要一个下拉列表,允许他们向休斯顿和旧金山的球队展示工作人员。

团队不是数据库中数据所代表的结构。我还想在未来任意定义自定义团队(在家工作的团队,知道C ++的团队等)。 “全部”团队意味着没有过滤。

项目的查询将是

select Member.MemberName, Member.MemberWork from Member where Member.Project='Project1'

对于Project1,旧金山队,我会写

select Member.MemberName, Member.MemberWork from Member where Member.Project='Project1' and Member.MemberID IN (123, 125, 127) /* teams are not stored in the database so I need to hardcode member IDs that compose a team */

我存储每个自定义下拉选项之间关系的方式如下

CREATE TABLE [dbo].[TeamQueries] ([ProjectName] [nchar](128) NULL,
[TeamName] [nchar](64) NULL,[TeamQuery] [nchar](3096) NULL
) ON [PRIMARY]

示例此表中的行将出现在此图像中(由于缺乏声誉,我无法发布)

SSRS报告中的查询(数据集称为“数据”)如下

 declare @query nvarchar(max)
    set @query= 'select Member.MemberName, Member.MemberWork from Member where Member.ProjectName=' + @ProjectDropdown + ' and Member.MemberID IN (' + @TeamQuery + ')'
    exec(@query)

@ProjectDropdown是一个单值TEXT参数,默认值和可用值来自查询

select ProjectName from Projects

@TeamQuery也是单值TEXT参数,默认值和可用值来自查询

SELECT TeamName  ,TeamQuery FROM TeamQueries
  WHERE (ProjectName=@ProjectDropdown or ProjectName = 'All')

在可用的下拉列表中选择Team1和旧金山,我收到的错误消息是:

  

数据集“数据”的查询执行失败。语法不正确   '127'。

下拉菜单填写得很好。通过选择Project1,我可以在下拉列表中选择旧金山和纽约。

我的问题是 - 出了什么问题,如何让它发挥作用?一般问题是我想要一个where谓词字符串(它是IN子句的一部分)来自数据库,并可选择在SSRS中应用。

以下是我尝试过的一些事情。

  • 我试图让这个构造在动态SQL之外工作。例如,使用OR构造来避免select Member.MemberID from Member并具有以下内容

select Member.MemberName, Member.MemberWork from Member where member.ProjectName=@ProjectDropdown and (@TeamQuery IS NULL OR Member.MemberID IN (@TeamQuery))

我不断收到VARCHAR到int转换错误。我试过了 select Member.MemberName, Member.MemberWork from Member where Member.ProjectName=@ProjectDropdown and (@TeamQuery IS NULL OR CONVERT(VARCHAR(Member.MemberID)) IN (@TeamQuery))

@TeamQueryINT转换为SPLIT并使TeamQuery成为多值参数。

我尝试在SSRS中打印@query,希望有一些可调试性,但我看不到SSRS正在使用的查询。

如果我在SSRS中对@TeamQuery的参数进行硬编码,则查询确实有效。我怀疑带有字符串和引号的东西 - 数据库检索的东西与我期望的略有不同(也许我需要删除引号?)

1 个答案:

答案 0 :(得分:0)

问题是该专栏的定义。我错误地将列定义设为nchar而不是nvarchar。这导致额外的填充和查询错误。