【问题标题】:An item with the same key has already been added. SSRS Report Builder已添加具有相同密钥的项目。 SSRS 报表生成器
【发布时间】:2016-03-25 01:09:45
【问题描述】:

我知道这里已经有一些论坛,但是有人可以帮我识别重复项以及如何为列名取别名吗?我相信底部的左连接在报告生成器中创建了这个错误。

SELECT  CASE A.DTASERIES
      WHEN 2 THEN 'Financial'
      WHEN 3 THEN 'Sales'
      WHEN 4 THEN 'Purchasing'
      WHEN 5 THEN 'Inventory'
      WHEN 6 THEN 'Payroll – USA'
      WHEN 7 THEN 'Project'
      ELSE ''
    END AS DTA_Series ,
    JRNENTRY AS JournalEntry,
    D.ACTNUMST AS AccountNumber,
    C.ACTDESCR AS AccountDescription,
    A.GROUPID AS DTA_GroupID,
    CODEID AS DTA_CodeID,
    GROUPAMT ,
    CASE 
    WHEN CODEAMT > 0 THEN CODEAMT
    ELSE 0 
    END AS Debit,
    CASE 
    WHEN CODEAMT < 0 THEN CODEAMT
    ELSE 0 
    END AS Credit,
    A.TRXDATE  AS TransactionDate,
    A.DTAREF AS DTA_Reference,

    DTA_GL_Reference ,
    A.DOCNUMBR AS OriginalDocumentNumber ,
    A.RMDTYPAL ,
    CASE PSTGSTUS
      WHEN 1 THEN 'Unposted'
      WHEN 2 THEN 'Posted'
      ELSE ''
    END AS DTA_PostingStatus ,
    B.DOCNUMBR ,
    B.RMDTYPAL ,
    POSTDESC AS PostingDescription,
    DTAQNTY 
    FROM    dbo.DTA10100 AS A
    LEFT OUTER JOIN dbo.DTA10200 AS B ON A.ACTINDX = B.ACTINDX
                                         AND A.DOCNUMBR = B.DOCNUMBR
                                         AND A.DTAREF = B.DTAREF
                                         AND A.DTASERIES = B.DTASERIES
                                         AND A.GROUPID = B.GROUPID
                                         AND A.SEQNUMBR = B.SEQNUMBR
    LEFT OUTER JOIN dbo.GL00100 AS C ON A.ACTINDX = C.ACTINDX
    LEFT OUTER JOIN dbo.GL00105 AS D ON C.ACTINDX = D.ACTINDX

【问题讨论】:

  • 请尝试将LEFT OUTER JOIN dbo.GL00105 AS D ON C.ACTINDX = D.ACTINDX改成LEFT OUTER JOIN dbo.GL00105 AS D ON A.ACTINDX = D.ACTINDX 好像是一样的但是连接应该更清晰
  • 您能否判断没有的每个列是否具有表别名前缀(即JRNENTRY)在所有连接表的列集中是否肯定是唯一的?
  • 事实上,我只是在每一列上放一个表别名。它使将来的分析和调试变得更加容易。

标签: sql reporting-services


【解决方案1】:

SSRS 在确定数据集的字段时仅查看列名,如果您 SELECT 一个或多个表中的两个具有相同名称的列,则会引发此错误。

在这种情况下,SELECT 子句中有 A.RMDTYPALB.RMDTYPAL,SSRS 将其视为两个 RMDTYPAL 列。别名其中一个或两个,此错误应该消失。

请参阅this similar question 了解更多信息。

编辑:(为清楚起见,我只列出两列)

SELECT  
    A.RMDTYPAL AS A_RMDTYPAL,
    B.RMDTYPAL AS B_RMDTYPAL
FROM dbo.DTA10100 AS A
    LEFT OUTER JOIN dbo.DTA10200 AS B ON A.ACTINDX = B.ACTINDX
                                     AND A.DOCNUMBR = B.DOCNUMBR
                                     AND A.DTAREF = B.DTAREF
                                     AND A.DTASERIES = B.DTASERIES
                                     AND A.GROUPID = B.GROUPID
                                     AND A.SEQNUMBR = B.SEQNUMBR
    LEFT OUTER JOIN dbo.GL00100 AS C ON A.ACTINDX = C.ACTINDX
    LEFT OUTER JOIN dbo.GL00105 AS D ON C.ACTINDX = D.ACTINDX

【讨论】:

  • 感谢您的回复-您能给我一个为其中一列创建别名的示例吗?以 A.GROUPID 为例,它在语句的顶部别名为 DTA_GroupID,当我在 LEFT OUTER JOIN 部分(查询的底部)更改 A.GROUPID 时,SQL 不会接受它。所以当我有 A.DTA_GroupID = B.GROUPID 查询有错误。试图弄清楚我是如何混淆这个错误的。
  • @JJK 有关示例,请参见上面的编辑。在 SQL 中,order of operationsFROM 子句,然后是 SELECT 子句,因此您不能在连接条件中使用列别名。
【解决方案2】:

以防万一它对其他人有帮助:

我在 SSRS 2008、SQL Server 2008 R2 中遇到了同样的错误。我的存储过程正在执行 SELECT * FROM #Results 以返回结果集。没有重复的列名/别名。但是,当我将其切换为仅单独选择所有列而不是 * 时,它解决了问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-27
    • 2021-08-02
    • 2011-03-01
    • 2017-11-17
    相关资源
    最近更新 更多