如何从 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 可能会因编写报告的方式而改变
是否可以查看 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 可能会因编写报告的方式而改变