優先順位を付けた重複データ1件を取得という要件があったのでいろいろ考え抜いて作ってみました。パフォーマンスは一切考えてないのでそれはのちの改善点として。
タグ: SQL
【β版開発室】データベース・テーブル Create SQL 作成簡易ツール (複数データベース対応)
各種データベースをセットアップした後にいったん仮置きでデータベースやテーブルを作っておきたい人もいると思います。そんな人の為に各種 Create SQL を自動生成するツールを作ってみました。
今回、仮で実装(β版)しているので機能の豊富さや使いやすさは考慮していません。入力した値に合わせて SQL が生成されます。
生成できる SQL の種類は「ユーザー」「データベース」「テーブル」「レコード」です。それ以外の Create SQL は現在対応していません。また細かいパラメータはいじることはできないので、パラメータを設定したい場合は生成した SQL に対して変更を行ってください。
生成する SQL が対応しているデータベースは「SQL Server」「PostgreSQL」「MySQL」です。選択項目にバージョンが記載されていますが、仕様変更がなければ他のバージョンでも使えると思います。
使い方はサンプルデータを見てまねて入力してください。そこまで難しいものではないですがユーザビリティとしてはちょっといまいちかなと思ってます。とりあえず作ってみたかったというレベルなので利用者が多くなりそうであれば改良してみたいと思います。
生成された SQL は一つにまとまっています。複数データベースを選択した場合も1つにまとまってるので使う際は SQL を切り出して実行してください。
例のごとく Blazor (WebAssembly) で作ってるので初回表示は少し時間がかかります。頻繁に利用する場合は PWA に対応しているのでスタートメニューにアプリとして登録しておくことも可能です。
[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 を使っているので大体同じです。
]]>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 を投げた場合ではエラーは出ないようです。
参考
- SQLSERVER2005_ROUND関数のバグ? (Microsoft Connect)
- SQLSERVER2005_ROUND関数のバグ? (@IT会議室)
- SQL Server Management Studio で ROUND 関数を使うとエラーが発生する
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 を実行すればサブスクリプションの実行内容がすべて完了しているものと思い込んでしまうと、次の処理を実行たときに、実はまだ処理が完了していなかった、なんてことになりかねないので注意してください。
]]>