如何从 Cognos 获取查询定义?

How to get a query definition from Cognos?

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

例如要获得报告的 XML 定义,您可以使用以下 SQL(从 复制):

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 中,您通常可以找到 sqltext 元素给出基础 SQL。但是,在使用现有查询的地方,很难看出数据的来源。

我想要相当于上述 SQL 的方法来查找查询定义;尽管到目前为止还找不到任何这样的专栏。

如果不行,有没有办法通过UI找到这个定义?我查看了 Query Studio 并找到了查询的 lineage,它提供了有关查询列的一些信息,但没有使数据的来源清晰。

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

... 将在 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

术语:

  • 查询主题可以被认为是table
  • Query Item可视为一列

对于您的示例,SQL 可能 R5BZDDAN_GRAPH 查询主题中定义,后者又在 Framework Manager 模型中定义。框架管理器模型在 .cpf 文件中定义,该文件根本不在内容存储中。 (尽管它是一个 XML 文件)。此文件 'published' 到 Cognos 以制作数据包。

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

我说你的SQL可能被定义了。如果查询主题是 SQL 查询主题,那么它就是定义的地方。如果查询主题是 model 查询主题,那么它只是来自其他查询主题的 query items 的列表。这些可能来自许多其他查询主题,这些查询主题随后在 Framework Manager 中定义了连接。所以那里没有实际的 SQL 定义 - 它在 运行 时间

生成

我不确定你的最终要求,但还有其他三种方法可以获得 SQL:

  • 在 Report Studio 中,您可以对每个查询'show generated SQL'
  • 在 Framework Manager 中,您可以 select 一个或多个查询主题并显示生成的 SQL
  • 您可以在数据库上使用监控工具来查看 SQL 正在提交的内容

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

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