在 SSRS 中,为什么我在创建新报告时会收到“已添加具有相同键的项”错误?

80

我在 SSRS 中遇到了以下错误:

保存查询设计方法时发生错误。
已添加具有相同键的项。

但是,“项”表示什么?我甚至尝试编辑 RDL 并删除所有引用所需使用的存储过程 prc_RPT_Select_BI_Completes_Data_View

这可能与存储过程使用动态 SQL(使用 N' 表示法)有关吗?

在存储过程中,我有:

SET @SQL +=  N'
SELECT   bi.SupplierID as ''Supplier ID''
        ,bi.SupplierName as ''Supplier Name''

        ,bi.PID as ''PID''
        ,bi.RespondentID as ''Respondent ID''

        ,lk_slt.Name as ''Entry Link Type''

        ,ts.SurveyNumber as ''Initial Survey ID'''

这里插入图片描述

9个回答

158

看起来SSRS有一个问题(至少在2008版本中) - 我正在学习这个网站,它解释了这个问题

如果你有两个具有相同名称的列(来自2个不同的表),那么就会导致这个问题。

来源代码如下:

SELECT a.Field1,a.Field2,a.Field3,b.Field1,b.field99 FROM TableA a JOIN TableB b on a.Field1 = b.Field1

SQL可以很好地处理它,因为我已经为每个加上了前缀别名(表)名称。但是SSRS仅使用列名作为键,而不是表+列,所以它会失败。

修复很简单,要么重命名第二列,即b.Field1 AS Field01,要么完全省略该字段,这就是我所做的。


2
如果SP/SQL返回重复的列名,您将遇到相同的问题。因为SSRS的主要问题在于这种情况下会抛出错误。 - Aftab Ansari
8
似乎在2012年仍存在这个问题。 - wilsjd
3
可能是因为这些工具来自2007年。微软真的需要在用户转向其他产品之前,让这个产品变得更好。 - Yuck
2
如果您忘记给出多个字段名称(例如计算字段),则会出现此问题。 SQL 返回“无列名”,而 SSRS 对两个名为“无列名”的字段感到不满。 这与重复的列名完全相同,但需要更长的时间才能发现。 - MsTapp
3
问题仍适用于SSRS 2016,我错误地选择了同一列两次并出现了这个错误。 - Kirk
显示剩余2条评论

9

我也遇到了同样的问题。调试之后,我解决了这个问题。如果你的SQL查询中列名出现了多次,则会出现这个问题。因此,在SQL查询中使用别名来区分列名。

例如:

SELECT
   column1,
   column2,
   column1
FROM
   table_name

在SQL查询中上述查询语句是正确的,但在SSRS报表中会出现问题。

Select P.ID, P.FirstName, P.LastName, D.ID, D.City, D.Area, D.Address
From PersonalDetails P
Left Join CommunicationDetails D On P.ID = D.PersonalDetailsID

原因:ID被重复提及(多次)

正确的查询语句:

Select P.ID As PersonalDetailsID, P.FirstName, P.LastName, D.ID, D.City, D.Area, D.Address
From PersonalDetails P
Left Join CommunicationDetails D On P.ID = D.PersonalDetailsID

7
我曾经遇到过这个问题。基于我的经验,通常是因为数据集中有多个字段名指向同一字段源导致出现此问题。 请查看以下帖子以获取详细的错误描述。

https://bi-rootdata.blogspot.com/2012/09/an-error-occurred-during-report.html

https://bi-rootdata.blogspot.com/2012/09/an-item-with-same-key-has-already-been.html

在您的情况下,您应该检查由Sp prc_RPT_Select_BI_Completes_Data_View返回的所有字段名称,并确保所有字段都具有唯一的名称。

1
如果在同一个存储过程中可能存在重复的字段,那会怎样?这种情况可能吗? - Caffeinated
2
如果存储过程返回了重复的字段并且您将所有字段与报表字段绑定,那么您将遇到相同的问题。 - Aftab Ansari

5

在一次报表查询中,我遇到了同样的错误。我从不同的表中选择了具有相同名称的列,并为每个表添加了前缀(例如:select a.description, b.description, c.description),这在Oracle中可以正常运行,但是对于报表而言,每个列必须具有唯一的别名,因此只需为具有相同名称的字段添加别名即可(例如:select a.description as a_description, b.description as b_description等)。


3

抱歉,这是对一个旧帖子的回应,但仍然可能有用。

除了上面的回复外, 通常情况下,当查询中包含两个具有相同名称的列时(即使来自不同的表),就会出现这种错误。 例如,如果我们连接两个表 city 和 state,这两个表都有名为 name 的列, 如 city.name 和 state.name。 当这样的查询添加到数据集时,SSRS 会删除表名或表别名,并且只保留名称,导致查询中出现重复键并报错。 避免这种错误的最佳方法是使用别名,例如将列名命名为 city.name as c_name 和 state.name as s_name。 这将解决该问题。


2
我在使用vs2015企业版、ssdt 14.1.xxx和ssrs时遇到了错误信息。对我来说,这与上述出现的同名两列问题不同。我添加了这个报告,然后删除了它,当我尝试在ssrs向导中重新添加查询时,出现了这个消息:"在保存查询设计方法时发生错误:无效的对象名称:tablename",其中tablename是向导正在读取的查询表。我尝试过清理项目,也尝试过重建项目。我认为,Microsoft在你删除报告时并没有完全清除报告,只要你尝试重新添加原始查询,它就不会添加。我解决它的方法是在一个全新的项目中创建ssrs报告(显然查询没有问题),然后将其保存到一边。然后我重新打开我的原始ssrs项目,在报告上右键单击,然后选择添加,再选择现有项目。报告成功地添加回来了,没有名称冲突。

1
我是一名有用的助手,可以翻译文本。
我刚刚遇到了这个错误,并且知道它与本地变量别名有关。在存储过程的结尾处,我像这样写:
select @localvariable1,@localvariable2

在SQL中它工作得很好,但是当我在SSRS中运行它时,它总是会报错,但是当我给它起了别名后,问题就解决了。

select @localvariable1 as A,@localvariable2 as B

1

SSRS不接受重复的列名,因此请确保您的查询或存储过程返回唯一的列名。


-1

如果您正在使用存储过程,并且该存储过程具有多个Select语句(在if条件内),则所有这些Select语句都需要使用唯一的字段名称进行处理。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接