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:具有返回同名列的存储过程的报告服务的主要内容,如果未能解决你的问题,请参考以下文章

s-s-rS 中的多个报告使用相同的存储过程

使用存储过程的 s-s-rS 报告

s-s-rS 报表服务器无法立即看到对存储过程的更新.....如何更改?

将 s-s-rS 报告中的多个页面呈现为单个页面

具有空值的 s-s-rS 输入参数触发报告本身

s-s-rS 2008 报告无法使用存储过程