s-s-rS:具有返回同名列的存储过程的报告服务
Posted
技术标签:
【中文标题】s-s-rS:具有返回同名列的存储过程的报告服务【英文标题】:s-s-rS: Reporting services with a stored procedure that returns columns with same name 【发布时间】:2016-11-30 16:39:03 【问题描述】:我们正在将报表从 Crystal Report 转换为 s-s-rS(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 个。
但它说提取的列与临时表不匹配。
我怎样才能做到这一点?
【问题讨论】:
如果您无法更改现有存储过程,请创建一个可以正常工作的新存储过程(副本)。转换完成后摆脱旧的。我错过了什么吗?没有必要让这变得困难,或者在已经存在的地方添加另一个黑客。修复它! 由于客户拒绝修改数据库/服务器端代码,我无法进行任何更改,否则我会修复存储过程。 【参考方案1】:您的临时表需要 6 列。将 exec 与 insert 表一起使用时,表 def 必须匹配:列数、数据类型和我相信可空性。
【讨论】:
我用另一种方式解决了这个问题。我会发布解决方案。 你的方式正是我所建议的。尽管似乎在深夜发帖,但我错过了最后一句话,应该说临时表中的字段名称不需要匹配:-) 哦,好吧,我当时不明白 :P... 我把代码放了,所以如果有人发现这可能会很快解决它【参考方案2】:我自己找到了解决方案,我只是在临时表中以不同的方式重命名了字段。
这是代码,假设 StupidStoredProcedure 提取这些具有相同名称的列 (SIGH :S)
a,b,c,a,b,c
IF OBJECT_ID('tempdb.dbo.#ARandomTempTable', 'U') IS NOT NULL
DROP TABLE #ARandomTempTable
CREATE TABLE #ARandomTempTable (
a NVARCHAR(255),
b NVARCHAR(255),
c NVARCHAR(255),
a2 NVARCHAR(255),
b2 NVARCHAR(255),
c2 NVARCHAR(255)
)
INSERT INTO #ARandomTempTable
EXEC StupidStoredProcedure @StupidParam = "Hello"
SELECT
a,
b,
c,
a2,
b2,
c2
FROM #ARandomTempTable
这样我就完全独立于存储过程的输出,我可以根据自己的意愿使用我的命名来处理结果参数。
感谢帮忙的人
【讨论】:
以上是关于s-s-rS:具有返回同名列的存储过程的报告服务的主要内容,如果未能解决你的问题,请参考以下文章