是否可以查看 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 报告中会以如下方式引用:
<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/