[SSRS] レポートマネージャーでレポートがサブスクリプションによって自動エクスポートされたときのログを確認する

メモ書きです。

環境

  • SQL Server : SQL Server 2008 R2

内容

ログを確認すると、エクスポートされたレポートの種類や、エクスポートにかかった時間、結果、出力サイズ、行数などが参照できます。

ログを確認するには SQL Server Reporting Services をインストールした時に作成されるデータベース「ReportServer」のテーブルを参照します。

以下の SQL を実行するとログの内容を確認できます。

use [ReportServer];

select
  B.[Path]                -- レポートのパスと名前
 ,A.[LogEntryId]
 ,A.[InstanceName]        -- レポートサーバーインスタンス名
 ,A.[ReportID]
 ,A.[UserName]            -- 実行ユーザー
 ,A.[ExecutionId]
 ,A.[RequestType]
 ,A.[Format]
 ,A.[Parameters]          -- レポートの出力に指定したパラメーター
 ,A.[ReportAction]
 ,A.[TimeStart]           -- 出力を開始した時間
 ,A.[TimeEnd]             -- 出力が完了した時間
 ,A.[TimeDataRetrieval]   -- データの取得にかかった時間 (単位はミリ秒)
 ,A.[TimeProcessing]      -- レポートの処理にかかった時間 (単位はミリ秒)
 ,A.[TimeRendering]       -- レポートの表示にかかった時間 (単位はミリ秒)
 ,A.[Source]
 ,A.[Status]              -- rsSuccess(成功) またはエラー コード
 ,A.[ByteCount]           -- レポートのファイルサイズ
 ,A.[RowCount]            -- クエリ結果の行数
from [ExecutionLogStorage] A
inner join [Catalog] B
  on B.[ItemID] = A.[ReportID]
where convert(varchar(8), A.[TimeStart], 112) = '20151104'  -- いつのデータを取得したいか、などの条件
order by A.[LogEntryId] desc;

各パラメータの詳しい情報などは以下の URL 先を参照してください。SharePoint について書かれていますが、内部では Reporting Service を使っているので大体同じです。

Share this...

SQL Server Management Studio で 0.5 を round するとエラーになる

環境

  • クライアント:SQL Server Management Studio 2008 R2
  • データベース:SQL Server 2008

内容

SQL Server Management Studio で「round(0.50, 0)」のように0.5<=x<1の範囲を round すると「expression をデータ型 numeric に変換中に、算術オーバーフロー エラーが発生しました。」というエラーが発生します。

下のコードのコメントを外すと確認できると思います。

select
 round(0.01, 0) as [0.01]
,round(0.49, 0) as [0.49]
--,round(0.50, 0) as [0.50] -- expression をデータ型 numeric に変換中に、
--,round(0.99, 0) as [0.99] -- 算術オーバーフロー エラーが発生しました。
,round(cast(0.50 as numeric(10, 2)), 0) as [0.50]
,round(cast(0.99 as numeric(10, 2)), 0) as [0.99]
,round(1.01, 0) as [1.01]
,round(1.49, 0) as [1.49]
,round(1.50, 0) as [1.50]
,round(1.99, 0) as [1.99]
,round(2.01, 0) as [2.01]

調べてみるとどうやら SQL Server Management Studio で実行したときだけ出るようで、プログラムなどから SQL を投げた場合ではエラーは出ないようです。

参考

Share this...

SQL Server Reporting Services で登録されているサブスクリプションを一括実行する SQL

概要

サブスクリプションは登録したスケジュールに従って自動的に実行されますが、任意のタイミングで一括実行したい場合もあるかと思います。ここではそれを行うための実行 SQL を載せています。

注意

この記事の内容はすべての環境で実行を保証しているわけではありません。また公式でサポートしている内容でもありませんので自己責任でお使いください。

動作確認環境

  • SQL Server 2008 Standard SP3

実行 SQL

-- SubscriptionID を入れる変数
declare @id as uniqueidentifier

-- ReportServer データベースの Subscriptions テーブルから登録されている
-- サブスクリプション ID 一覧を取得
declare NEW_cursor cursor for
select SubscriptionID
from ReportServer.dbo.Subscriptions

-- カーソルオープン
open NEW_cursor

-- FETCH スタート
fetch next from NEW_cursor
into @id

while @@FETCH_STATUS = 0
begin
  -- サブスクリプションの実行イベント追加 (非同期)
  exec ReportServer.dbo.AddEvent @EventType='TimedSubscription', @EventData=@id

  -- 次の ID へ
  fetch next from NEW_cursor
  into @id
end		

-- カーソルクローズ
close NEW_cursor
deallocate NEW_cursor

補足

この SQL はあくまでもイベントを登録しているだけなので即座にサブスクリプションの内容が実行されるわけではありません(非同期)。この SQL を実行すればサブスクリプションの実行内容がすべて完了しているものと思い込んでしまうと、次の処理を実行たときに、実はまだ処理が完了していなかった、なんてことになりかねないので注意してください。

Share this...

Oracle で OUT引数のあるストアドプロシージャを呼び出すときの引数の指定の仕方

【環境】

  • Oracle 10g Release 2

【内容】

OUT 引数によって変数に値を返す場合は、呼び出し側の OUT 引数の前に「:(コロン)」を追加します。

■例1(out 引数が一番最後にある場合)

・ストアド側 (定義)

StoredFunction(arg1 in varchar2, arg2 in varchar2 arg3 out varchar2)

・呼び出し側

variable argA varchar2(255)
variable argB varchar2(255)
variable argC varchar2(255)

execute StoredFunction(argA, argB, :argC)

■例2(out 引数が一番最初にある場合)

・ストアド側 (定義)

StoredFunction(arg1 out varchar2, arg2 in varchar2 arg3 in varchar2)

・呼び出し側

variable argA varchar2(255)
variable argB varchar2(255)
variable argC varchar2(255)

execute StoredFunction(:argA, argB, argC)

■例3(out 引数が複数ある場合)

・ストアド側 (定義)

StoredFunction(arg1 out varchar2, arg2 in varchar2 arg3 out varchar2)

・呼び出し側

variable argA varchar2(255)
variable argB varchar2(255)
variable argC varchar2(255)

execute StoredFunction(:argA, argB, :argC)
Share this...