sql - 如何从 Cognos 获取查询定义?

标签 sql cognos

是否可以查看 Cognos 查询中使用的 SQL?

例如要获取报告的 XML 定义,您可以使用以下 SQL(复制自 https://stackoverflow.com/a/24335760/361842 ):

SELECT     CMOBJNAMES.NAME AS ObjName
, CMOBJECTS.PCMID
, CMCLASSES.NAME AS ClassName
, cast(CMOBJPROPS7.spec as xml) ReportDefinition
FROM       CMOBJECTS 
INNER JOIN       CMOBJNAMES ON CMOBJECTS.CMID    = CMOBJNAMES.CMID
INNER JOIN       CMCLASSES       ON CMOBJECTS.CLASSID = CMCLASSES.CLASSID
LEFT OUTER JOIN  CMOBJPROPS7     ON CMOBJECTS.CMID = CMOBJPROPS7.CMID
WHERE     CMOBJECTS.CLASSID IN (10, 37)
ORDER BY CMOBJECTS.PCMID;

...从该 XML 中,您经常可以找到提供底层 SQL 的 sqltext 元素。然而,在使用现有查询的地方很难看出数据来自哪里。

我想要与上述 SQL 等效的语句来查找查询定义;尽管到目前为止还找不到任何这样的专栏。

如果做不到这一点,有没有办法通过 UI 找到这个定义?我查看了 Query Studio,发现查询的 lineage 提供了有关查询列的一些信息,但并没有明确数据的来源。

注意:通过查询,我指的是以下 Query Studio 屏幕截图中的 R5BZDDAN_GRAPH 等查询:

Cognos Queries

...在 Cognos 报告中会以如下方式引用:

<query name="Q_DEMO">
  <source>
    <model/>
  </source>
  <selection autoSummary="false">
    <dataItem aggregate="none" name="REG_REG" rollupAggregate="none">
      <expression>[AdvRepData].[Q_R5BZDDAN_GRAPH].[REG_REG]</expression>
    </dataItem>
    <dataItem aggregate="none" name="REG_ORG" rollupAggregate="none">
      <expression>[AdvRepData].[Q_R5BZDDAN_GRAPH].[REG_ORG]</expression>
    </dataItem>
    <!-- ... -->

更新

为了其他人的利益,这里是上述代码的修改版本,用于撤返回告定义:

;with recurse
as (

    select Objects.CMID Id, ObjectClasses.Name Class, ObjectNames.NAME Name
    , cast('CognosObjects' as nvarchar(max)) ObjectPath
    from CMOBJECTS Objects
    inner join CMOBJNAMES ObjectNames 
        on ObjectNames.CMID = Objects.CMID 
        and ObjectNames.IsDefault = 1 --only get 1 result per object (could filter on language=English (LocaleId=24 / select LocaleId from CMLOCALES where Locale = 'en'))
    inner join CMCLASSES ObjectClasses on ObjectClasses.CLASSID = Objects.CLASSID
    where Objects.PCMID = objects.CMID --cleaner than selecting on root since not language sensitive
    --where ObjectClasses.NAME = 'root'

    union all 

    select Objects.CMID Id, ObjectClasses.Name Class, ObjectNames.NAME Name
    , r.ObjectPath + '\' + ObjectNames.NAME ObjectPath  --I use a backslash rather than forward slash as using this to build a windows path 
    from recurse r
    inner join CMOBJECTS Objects 
        on objects.PCMID = r.Id 
        and Objects.PCMID != objects.CMID --prevent ouroboros
    inner join CMOBJNAMES ObjectNames 
        on ObjectNames.CMID = Objects.CMID
        and ObjectNames.IsDefault = 1 --only get 1 result per object (could filter on language=English (LocaleId=24 / select LocaleId from CMLOCALES where Locale = 'en'))
    inner join CMCLASSES ObjectClasses 
        on ObjectClasses.CLASSID = Objects.CLASSID

)
select * 
from recurse 
where Class in ('report','query')
order by ObjectPath

最佳答案

术语:

  • 查询主题可以被视为一个表
  • 查询项可以被视为一列

对于您的示例,SQL可能R5BZDDAN_GRAPH查询主题中定义,而该主题又在 Framework Manager 模型中定义。框架管理器模型是在 .cpf 文件中定义的,该文件根本不在内容存储中。 (虽然它是一个 XML 文件)。该文件被“发布”到 Cognos 以制作包。

实际 cognos 服务器上还有一个框架管理器文件的缓存版本(.cqe 文件),尽管通常不建议依赖于此

我说你的 SQL可能已被定义。如果查询主题是SQL查询主题,那么它就是在其中定义的。如果查询主题是一个模型查询主题,那么它只是来自其他查询主题的查询项的列表。这些可能来自许多其他查询主题,这些主题随后在 Framework Manager 中定义了联接。所以那里没有定义实际的 SQL - 它是在运行时生成的

我不确定您的最终要求,但还有其他三种获取 SQL 的方法:

  • 在 Report Studio 中,您可以在每个查询上“显示生成的 SQL”
  • 在 Framework Manager 中,您可以选择一个或多个查询主题并显示生成的 SQL
  • 您可以在数据库上使用监控工具来查看正在提交的 SQL

如果您只是想知道报告中的数字是如何生成的,最直接的解决方案是监控您的数据库。

最后请记住,在极少数情况下,Framework Manager 中定义的 SQL 可能会因报告的编写方式而改变

关于sql - 如何从 Cognos 获取查询定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41070818/

相关文章:

java - 如何使用登录名/密码连接到 Java 中的 IBM Cognos BI?

Javascript 打开新选项卡 cognos authoring 透视模式

涉及join的Mysql更新语句

java - 坚持使用 sql/hql 查询组

javascript - Cognos 11.0.11 - Javascript 显示/隐藏日期提示

javascript - Cognos 文本框提示的多重检查

crosstab - Cognos 交叉表

mysql - 如何防止MySQL用户定义变量冲突

sql - 存储树数据的快速关系方法(例如文章的线程评论)

mysql大查询优化