Ist es möglich, das in Cognos-Abfragen verwendete SQL anzuzeigen?Wie erhält man eine Abfragedefinition von Cognos?
z.B. Um die XML-Definition eines Bericht erhalten Sie die folgenden SQL verwenden können (kopiert von 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;
... und von diesem XML können Sie oft sqltext
Elemente geben den zugrunde liegenden SQL finden. Wo jedoch vorhandene Abfragen verwendet werden, ist es schwer zu erkennen, woher diese Daten stammen.
Ich möchte das Äquivalent des obigen SQL, um Abfragedefinitionen zu finden; obwohl es bisher keine solche Kolumne gab.
Fehlt das, gibt es eine Möglichkeit, diese Definition über die Benutzeroberfläche zu finden? Ich schaute unter Query Studio und fand die lineage
der Abfrage, die einige Informationen über die Abfrage-Spalten gibt, aber die Quelle der Daten nicht klar macht.
NB: Nach Abfrage Ich beziehe mich auf jene wie R5BZDDAN_GRAPH
in dem unten stehenden Screenshot von Query Studio:
..., die in einer Art und Weise in einem Cognos Report bezeichnet würde eine solche wie:
<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
Zum Wohle der anderen, hier ist eine geänderte Version des obigen Code für Bericht definitons zurückziehen:
;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
Alle Abfragedefinitionen für einen Bericht in dem Bericht XML sind, wenn das, was Sie ist bedeuten. Was genau meinen Sie mit "Abfragedefinitionen" und "vorhandenen Abfragen"? Meinst du Abfrageabkürzungen in Berichten, SQL-Quelle in Berichten? Wenn es im Bericht ist, dann ist es in der XML. Der schwierigste Teil ist, wenn ein Bericht von Abfragesubjekten in einem Paket erstellt wird - das unter Verwendung der Berichtsdefinition für das Paket ausgewertet werden muss und nirgendwo gespeichert wird –
Danke @NickMcDermaid. Ich habe jetzt einen Screenshot hinzugefügt, um meine Frage zu klären. Ich bin vertraut mit wird verwendet, um SQL-Anweisungen direkt in Berichte einzubetten; aber in diesem Fall hoffe ich, die vordefinierten Abfragen zu verstehen; Ich nehme an, dass Sie 'Query Subjects' nennen; obwohl ich mit der Cognos-Terminologie nicht vertraut genug bin. Danke noch einmal. –
JohnLBevan