我的总体目标是制作一份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中应用。
以下是我尝试过的一些事情。
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))
或@TeamQuery
将INT
转换为SPLIT
并使TeamQuery成为多值参数。
我尝试在SSRS中打印@query
,希望有一些可调试性,但我看不到SSRS正在使用的查询。
如果我在SSRS中对@TeamQuery的参数进行硬编码,则查询确实有效。我怀疑带有字符串和引号的东西 - 数据库检索的东西与我期望的略有不同(也许我需要删除引号?)
答案 0 :(得分:0)
问题是该专栏的定义。我错误地将列定义设为nchar而不是nvarchar。这导致额外的填充和查询错误。