Поиск 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, так что вам еще нужно избавиться от буквального пространства кодирования и так далее. Кроме того, это не работает (пока ...) для многозначных параметров.
Это предполагает, что хранимые процедуры вызываются только из-за выполнения отчета –
Hi Long, спасибо за ответ, который он очень ценит. Кажется, что вам нужно повторно заново зарегистрировать все параметры во второй раз, когда они уже были сохранены в таблицу ExecutionLogStorage, даже если они не находятся в наиболее удобном для использования формате. У меня также есть много много хранимых процедур, которые мне нужно будет добавить к этому примеру кода, на который потребуется значительное время. – PJD
Надеюсь, это поможет вам в вашем случае: http://jegansubramaniam.blogspot.com/2012/02/ssrs-method-to-retrieve-last-run-report.html – LONG