【发布时间】:2016-11-30 16:39:03
【问题描述】:
我们正在将报表从 Crystal Report 转换为 SSRS(Sql Server Reporting Services)。
原始报告是通过存储过程提供的结果,该存储过程返回具有相同确切名称的列。
这怎么可能?我给你解释一下:
以前的程序员做了一些可怕的黑客攻击。它将选择结果放入#TempTable。
让我们假设选择填充#TempTable 确实
SELECT a,b,c INTO #TempTable FROM mytable
然后在存储过程结束时返回的是:
SELECT aliasTemp.*, a, b, c from #TempTable aliasTemp
返回的结果是
a,b,c,a,b,c
这在 SQL 方面很糟糕,但我无法更改数据库,因为我的客户不希望对生产环境进行任何更改。
当我尝试将此存储过程作为数据源添加到报告中时,我得到以下信息:
这是一个不言自明的错误,它表示,当报告服务尝试检索存储过程返回的字段时,如果发现重复的命名列,它将无法工作。
由于报告服务允许您同时使用 sql 查询或存储过程,我认为解决方案可能是将此查询作为 SQL SELECT 直接放入报告中
CREATE TABLE #tmpBus
(
a INT,
b INT,
c INT
)
INSERT INTO #tempTable
Exec StupidStoredProcedure'Params'
避免检索具有相同名称的额外列并仅提取前 3 个。
但它说提取的列与临时表不匹配。
我怎样才能做到这一点?
【问题讨论】:
-
如果您无法更改现有存储过程,请创建一个可以正常工作的新存储过程(副本)。转换完成后摆脱旧的。我错过了什么吗?没有必要让这变得困难,或者在已经存在的地方添加另一个黑客。修复它!
-
由于客户拒绝修改数据库/服务器端代码,我无法进行任何更改,否则我会修复存储过程。
标签: c# sql-server reporting-services