2

我对 SQLServer 世界比较陌生,我正在尝试为我正在合作的公司学习 SSRS 2005,所以如果我在研究中遗漏了任何明显的答案,请原谅我。

我遇到的问题是我有一个报告,它允许用户按列对主表进行排序,只有当报告服务器刷新报告时,用户排序才会重置。这引起了现场用户的大量抱怨,他们在大部分日常任务中都使用此报告。

该报告基本上是一个表,它根据给定的参数和存储过程返回的数据返回多个结果。排序功能是通过在每列的表头上设置用户排序来实现的。

任何帮助,将不胜感激。

4

1 回答 1

0

如果您有很多用户整天都在使用该报告,但对它进行了不同的排序,那么我首先会看看他们还有哪些其他要求导致他们以不同的方式使用该报告。您可能会发现排序只是冰山一角,几个用户组只能使用一个报告,而他们可以使用多个自定义构建的报告。

为了允许他们通过刷新进行排序和维护排序,我将通过动态存储过程使用参数化报告。可能有一个更简单的方法 - 但这应该可以解决问题。但是,您必须手动标记动态查询源的字段 - 只需确保 FieldSource 与您的列名相同,您将正确提取数据并能够将值分配给单元格。

列排序选择示例:

CREATE PROC getSortColumns 
AS
SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'DimEmployee' AND TABLE_SCHEMA='dbo'

现在创建将使用排序顺序的动态存储过程:

CREATE PROC getEmployees ( @OrderByClause varchar(100) ) AS

-- Create a variable @SQLStatement
DECLARE @SQLStatement varchar(255)

-- Enter the dynamic SQL statement into the
-- variable @SQLStatement
SELECT @SQLStatement = 'SELECT Title, FirstName, LastName, HireDate, Status ' +
                       'FROM dbo.DimEmployee ORDER BY ' + @OrderByClause

-- Execute the SQL statement
EXEC(@SQLStatement)

您可以测试查询是否手动工作:

exec getEmployees @OrderbyClause = LastName

在 BIDS 中,您将收到查询中缺少您的字段的警告消息。我在 SQL 2012 中测试了这个解决方案,所以它可能在早期版本中不起作用,抱歉我无法确认。

创建两个数据集,一个用于列名,一个用于查询。为列名设置默认值和值,手动命名并列出主数据集上的查询字段,否则它将无法识别查询中的任何字段。

不是特别可维护......我肯定会首先调查报告要求。希望这可以帮助!

有关动态查询说明,请参阅4 Guys ,有关获取列名的说明,请参阅此问题

于 2012-12-24T20:18:13.637 回答