2017-01-04 4 views
0

В настоящее время я создаю ряд инструментов ведения журнала и анализа, чтобы следить за нашей средой SQL. В настоящее время мы используем SQL Server 2014.Отчет SSRS Параметры переданы

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

В конце дня я хотел бы, чтобы иметь возможность выводить выводимый оператор и запускать его в SSMS без использования отчета. Я смотрел таблицу ExceutionLogStorage и представление ExecutionLog, и хотя он имеет большую часть необходимой мне информации, параметры не находятся в легкодоступном состоянии.

Кто-нибудь сделал что-то похожее на то, что я описал?

ответ

0

Вы должны добавить протоколирование части в оригинальном SP, например:

Alter procedure a 
(@parameter) 
As 
Begin 
.. 
.. 
Insert into loggingTable(col) 
Values(@parameter) 
.. 
.. 
End 

Затем запрос прямо против этого loggingTable для получения истории использованных параметров

+0

Это предполагает, что хранимые процедуры вызываются только из-за выполнения отчета –

+0

Hi Long, спасибо за ответ, который он очень ценит. Кажется, что вам нужно повторно заново зарегистрировать все параметры во второй раз, когда они уже были сохранены в таблицу ExecutionLogStorage, даже если они не находятся в наиболее удобном для использования формате. У меня также есть много много хранимых процедур, которые мне нужно будет добавить к этому примеру кода, на который потребуется значительное время. – PJD

+0

Надеюсь, это поможет вам в вашем случае: http://jegansubramaniam.blogspot.com/2012/02/ssrs-method-to-retrieve-last-run-report.html – LONG

0

Поиск Google вокруг этой темы быстро принесло следующие blog post, которые уже определены OP как полезные и показаны ниже (этот запрос сам по себе является расширением работы, связанной с ответом LONG ниже)

SELECT TOP 1 ParValue 
    FROM (
    SELECT els.TimeEnd 
     , IIF(CHARINDEX('&' + 'ParameterName' + '=', ParsString) = 0, 'ParameterName', 
     SUBSTRING(ParsString 
      , StartIndex 
      , CHARINDEX('&', ParsString, StartIndex) - StartIndex)) AS ParValue 
     FROM (SELECT ReportID, TimeEnd 
      , '&' + CONVERT(VARCHAR(MAX), Parameters) + '&' AS ParsString 
      , CHARINDEX('&' + 'ParameterName' + '=', '&' + CONVERT(VARCHAR(MAX), Parameters) + '&') 
       + LEN('&' + 'ParameterName' + '=') AS StartIndex 
      FROM ExecutionLogStorage 
      WHERE UserName='UserName' -- e.g. DOMAIN\Joe_Smith 
     ) AS els 
     INNER JOIN [Catalog] AS c ON c.ItemID = els.ReportID 
     WHERE c.Name = 'ReportName' 
    UNION ALL 
    SELECT CAST('2000-01-01' AS DateTime), 'ParameterName' 
) i 
    ORDER BY TimeEnd DESC; 

Оба эти подхода, хотя действительно дают нам только отправную точку, поскольку они (по-разному) полагаются на нас, зная заранее имя отчета и имена параметров. Хотя мы можем быстро внести несколько изменений в работу Кена Боумана, чтобы заставить ее работать против всех исполнений всех отчетов, у нас все еще есть проблема, что запрос жестко задает имя параметра.

Параметры, необходимые для выполнения отчета, хранятся в таблице Catalog в столбце Parameter. Хотя столбец имеет тип данных ntext, он фактически сохраняет XML-строку. Значение мы можем использовать XPath запрос, чтобы получить на имена параметров

with 
CatalogData as (
    select ItemID, [Path], [Name], cast(Parameter as xml) 'ParameterXml' 
    from Catalog 
    where [Type] = 2), 
ReportParameters as (
    select ItemID, [Path], [Name], ParameterXml, p.value('Name[1]', 'nvarchar(256)') 'ParameterName' 
    from CatalogData 
    cross apply ParameterXml.nodes('/Parameters/Parameter') as Parameters(p)) 
select * 
from ReportParameters; 

Выполнение этого запроса будет список всех отчетов на сервере и их параметров. Теперь нам просто нужно совместить это с запросом Кена Боумена. Я пошел с подходом КТР

with 
CatalogData as (
    select ItemID, [Path], [Name], cast(Parameter as xml) 'ParameterXml' 
    from Catalog 
    where [Type] = 2), 
ReportParameters as (
    select ItemID, [Path], [Name], p.value('Name[1]', 'nvarchar(256)') 'ParameterName' 
    from CatalogData 
    cross apply ParameterXml.nodes('/Parameters/Parameter') as Parameters(p)) 
select 
    els.TimeEnd 
    , c.[Name] 
    , rp.ParameterName 
    , iif(
     charindex(
      '&' + rp.ParameterName + '=', ParametersString) = 0 
      , rp.ParameterName, substring(ParametersString 
      , StartIndex, charindex('&', ParametersString, StartIndex) - StartIndex 
    )) 'ParameterValue' 
from (
    select 
     ReportID 
     , TimeEnd 
     , rp.ParameterName 
     , '&' + convert(varchar(max), Parameters) + '&' 'ParametersString' 
     , charindex(
      '&' + rp.ParameterName + '=', 
      '&' + convert(varchar(max), Parameters) + '&' 
     ) + len('&' + rp.ParameterName + '=') 'StartIndex' 
    from 
    ExecutionLogStorage 
    inner join ReportParameters rp on rp.ItemID = ReportID) AS els 
inner join [Catalog] c on c.ItemID = els.ReportID 
inner join ReportParameters rp on rp.ItemID = c.ItemID and rp.ParameterName = els.ParameterName; 

Обратите внимание, что значения параметров передаются в отчет как часть URL, так что вам еще нужно избавиться от буквального пространства кодирования и так далее. Кроме того, это не работает (пока ...) для многозначных параметров.

+0

Привет, Пол, спасибо за ответ, я сделал натолкнулся на этот код на мои поездки и попытался запустить его, но я очень мало вернулся, я удалил предложение where, чтобы получить все из моего ExecutionLogStorage, но продолжаю возвращать один столбец с именем ParValue со значением записи ParameterName.Есть ли что-то еще, что мне нужно сделать, чтобы сделать эту работу, любая другая помощь будет замечательной! – PJD

+0

Запрос, как указано, для самого последнего выполнения одного отчета. Чтобы получить все отчеты/исполнения, удалите «SELECT TOP 1 ParValue FROM (», а затем все после предложения «WHERE c.Name ...». Вероятно, вы также удалили бы и имя UserName where. застрял в том, что он использовал имена параметров в каждом отчете.Они могут найти столбец Parameter в таблице Catalog. Хотя ntext его фактически XML может быть запрошен. –

+0

Это тихое утро (сотрудники/студенты не вернутся на следующую неделю!) и Интерес к piqued, поэтому я пошел немного дальше. См. мой пересмотренный ответ для решения. –

Смежные вопросы