是否可以查看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报告的方式,例如被称为如:
<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
所有报表的查询定义是在报告中XML的方式改变了,如果这就是你意思。 “查询定义”和“现有查询”究竟是什么意思?你是指报告中的查询快捷键,报告中的SQL源?如果它在报告中,那么它在XML中。棘手的部分是当报告是从包中的查询主题制作的 - 需要使用报告定义对包进行评估并且不存储在任何地方 –
谢谢@NickMcDermaid。我现在添加了一个截图来帮助澄清我的问题。我熟悉用直接在报表中嵌入sql语句;但在这种情况下,我希望了解预定义的查询;我认为这就是你所说的“查询主题”;尽管Cognos不太熟悉Cognos术语。再次感谢。 –
JohnLBevan