如果您有很多用户整天都在使用该报告,但对它进行了不同的排序,那么我首先要看看他们还有哪些其他要求导致他们以不同的方式使用该报告。您可能会发现排序只是冰山一角,几个用户组只能使用一个报告,而他们可以使用多个自定义构建的报告。
为了允许他们通过刷新进行排序和维护排序,我将通过动态存储过程使用参数化报告。可能有一个更简单的方法 - 但这应该可以解决问题。不过,您必须手动标记动态查询源的字段 - 只需确保 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,获取列名解释见this question