Используя T-SQL, найдите хранимую процедуру, связанную с отчетом SSRS. - PullRequest
0 голосов
/ 06 ноября 2018

У меня была некоторая помощь в написании этого запроса - я немного растерялся, потому что я пытаюсь найти используемый тип запроса или процедуру, и я не уверен, что еще добавить в запрос или как изменить это.

SELECT      
    Ds.Name as Data_Source_Name,
    C2.Name AS Data_Source_Reference_Name,
    C.Name AS Dependent_Item_Name,
    C.Path AS Dependent_Item_Path,
    ds.*
FROM
    ReportServer.dbo.DataSource AS DS
INNER JOIN  
    ReportServer.dbo.Catalog AS C ON DS.ItemID = C.ItemID 
                                  AND DS.Link IN (SELECT ItemID 
                                                  FROM ReportServer.dbo.Catalog
                                                  WHERE Type = 5) --Type 5 identifies data sources
FULL OUTER JOIN 
    ReportServer.dbo.Catalog C2 ON DS.Link = C2.ItemID
WHERE
    C2.Type = 5
    AND c.name LIKE '%mkt%'
ORDER BY    
    C.Path, C2.Name ASC, C.Name ASC;

Пожалуйста, сообщите.

enter image description here

Ответы [ 3 ]

0 голосов
/ 07 ноября 2018

Вы находитесь в правильном соседстве ... Когда RDL отчета публикуется, его XML преобразуется в тип данных изображения и сохраняется в dbo.Catalog.Content.

Если вы преобразуете данные изображения в VARBINARY (MAX), а затем преобразуете в XML, вы сможете читать XML в виде простого текста.

SELECT TOP (10)
    *
FROM
    dbo.Catalog c
    CROSS APPLY ( VALUES (CONVERT(XML, CONVERT(VARBINARY(MAX), c.Content))) ) cx (content_xml)
WHERE 
    c.Type = 2;

Оттуда просто нужно проанализировать XML, чтобы найти то, что вы ищете. В этом случае вы ищете теги, которые выглядят следующим образом ...

<DataSet Name="My_stored_proc">
0 голосов
/ 07 ноября 2018

Исходя из моего комментария, попробуйте, если вы движетесь в правильном направлении, в том, как вы можете анализировать xml и обнулять конкретную команду.

Возможно, вам придется обновить пространства имен в приведенном ниже сценарии, а также добавить имя вашего отчета.

Но попробуйте что-то вроде этого:

;WITH XMLNAMESPACES (DEFAULT 'http://schemas.microsoft.com/sqlserver/reporting/2008/01/reportdefinition') --You may have to change this based on you SSRS version
SELECT
    [Path],
    Name,
    report_xml.value( '(/Report/DataSources/DataSource/@Name)[1]', 'VARCHAR(50)' ) AS DataSource,
    report_xml.value( '(/Report/DataSets/DataSet/Query/CommandText/text())[1]', 'VARCHAR(MAX)' ) AS CommandText, 
    report_xml.value( '(/Report/DataSets/DataSet/Query/CommandType/text())[1]', 'VARCHAR(100)' ) AS CommandType, 
    report_xml
FROM
    (
    SELECT 
        [Path], 
        Name, 
        [Type],
        CAST( CAST( content AS VARBINARY(MAX) ) AS XML ) report_xml 
    FROM dbo.[Catalog]
    WHERE Content IS NOT NULL
    AND [Type] = 2
    ) x
WHERE 
--use below in where clause if searching for the CommandText.  Depending on how the report was developed I would just use the proc name and no brackets or schema.
--Example:  if you report was developed as having [dbo].[procName] just use LIKE '%procName%' below.  Because other reports could just have dbo.procName.
report_xml.value( '(/Report/DataSets/DataSet/Query/CommandText/text())[1]', 'VARCHAR(MAX)' ) LIKE '%Your Proc Name here%'
--comment out the above and uncomment below if know your report name and want to search for that specific report.
--[x].[Name] = 'The Name Of Your Report'
0 голосов
/ 07 ноября 2018

Вы ищете имя хранимой процедуры? Если вы ищете, где это находится в самой базе данных, база данных> DatabaseName> Программируемость> Хранимые процедуры. Если вы пытаетесь использовать запрос, созданный вами для отчета, вам нужно создать хранимую процедуру или изменить тип запроса на текстовый и вставить его в поле.

...