2016-12-10 42 views
0

是否可以查看Cognos查询中使用的SQL?如何从Cognos获取查询定义?

例如为了得到一个报告的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,你可以经常发现sqltext元素赋予底层的SQL。但是,在使用现有查询的情况下,很难看到数据来自哪里。

我想要相当于上面的SQL查找查询定义;尽管迄今为止一直未能找到任何这样的专栏。

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

注:通过查询我指的是那些如R5BZDDAN_GRAPH在下面的截图来自Query Studio中:

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> 
    <!-- ... --> 

UPDATE

为他人谋取利益,这里是上述代码的修改版本拉回报告。定义:

;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 
+0

所有报表的查询定义是在报告中XML的方式改变了,如果这就是你意思。 “查询定义”和“现有查询”究竟是什么意思?你是指报告中的查询快捷键,报告中的SQL源?如果它在报告中,那么它在XML中。棘手的部分是当报告是从包中的查询主题制作的 - 需要使用报告定义对包进行评估并且不存储在任何地方 –

+0

谢谢@NickMcDermaid。我现在添加了一个截图来帮助澄清我的问题。我熟悉用直接在报表中嵌入sql语句;但在这种情况下,我希望了解预定义的查询;我认为这就是你所说的“查询主题”;尽管Cognos不太熟悉Cognos术语。再次感谢。 – JohnLBevan

回答

1

术语:

  • 查询主题可以被认为是表
  • 查询项目可以视为列

对于您的示例,SQL 可能为R5BZDDAN_GRAPH查询主题中定义,该主题在Framework Manager模型中依次定义。框架管理器模型在.cpf文件中定义,该文件完全不在内容存储器中。 (尽管它是一个XML文件)。该文件已发布到Cognos以制作包。

也有实际的COGNOS服务器上,框架管理文件的缓存版本(一个.cqe文件),但一般不建议依靠这个

我说你的SQL 可能定义。如果查询主题是查询主题,那么它就是其定义的位置。如果如果查询主题是模型查询主题,则它仅仅是来自其他查询主题的查询项目的列表。这些可能来自许多其他查询主题,然后在Framework Manager中定义连接。所以定义有没有实际的SQL - 它能够在运行时产生的

我不知道你到底要求,但也有其他三种方法来获得SQL:

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

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

最后请记住,在某些罕见的情况下,在Framework Manager中定义的SQL可能是由报告撰写

+0

谢谢Nick;美妙的答案。仅供参考:关于我的要求,主要是为了了解Cognos中的事情如何组合在一起。这是由于我之前为我们公司在报告的sqltext定义中发现了一些写得不好的sql报告而提供的优化报告,然后提供了帮助优化社区成员的报告,假设它看起来是相同的,看到使用了我无法找到SQL的查询。 – JohnLBevan

+0

ps。上面提到的社区是一个安全的论坛;如果任何人有权访问并且感兴趣,那么这个线程在这里:https://community.inforxtreme.com/infor-eam-7i-ee-be-product-group/f/infor-eam-7i-ee-be-product -group --- discussion/8187/work-order-print-performance – JohnLBevan

+1

感谢您的澄清。祝你好运 –