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 を実行すればサブスクリプションの実行内容がすべて完了しているものと思い込んでしまうと、次の処理を実行たときに、実はまだ処理が完了していなかった、なんてことになりかねないので注意してください。

]]>

HTTP経由でキューブにアクセスする方法

ネットワークが特殊な環境で2383ポートが使用できず、80(または443)ポートが使用可能な場合、HTTP経由でキューブにアクセスする方法があります。

詳しくは公式サイトに載っていますので手順通りに設定すれば問題ないかと思います。

※SQL Server 2012 へのリンクページですが、デフォルトのページが一部英語であったため、すべて日本語になっている上記のリンクに飛ばしています。

 

上記のリンク先の説明で気をつける点があります。

まず「msmdpump.dll」「msmdpump.ini」「Resources」の配置先が「C:inetpubwwwrootolap」と「C:inetpubwwwrootolapisapi」の2パターンが書いてありますが、isapiフォルダはなくても問題ありません。接続先のURLを短くしたいのであれば olap フォルダの直下に上記の3つを入れてしまった方がいいでしょう。

もう一点「msmdpump.ini」ファイル内の「ServerName」のサーバー名は「IISから見たキューブ(Anarysis Services)があるサーバーの名前」です。ですので、IISとキューブが同じサーバーにある場合はそのまま「localhost」で問題ありません。勘違いして外から見たIISサーバー名を指定するとつながらなくなってしまう場合があります。私はこれで結構はまってしまいました。

]]>

[SSRS] Tablix の列ヘッダを改ページしても表示させたままにする方法

設定がわかりにくかったのでメモ。

下のような列ヘッダー1行と詳細データ1行の Tablix を配置しているものとします。

列ヘッダーA 列ヘッダーB 列ヘッダーC 列ヘッダーD
詳細データA 詳細データB 詳細データC 詳細データD

 

レポートを表示した際に詳細データに表示される行数が多くなると自動的に改ページされるようになりますが、改ページを行った場合、2ページ目以降も列ヘッダーを表示してほしい場合が多いと思いますが、残念ながらデフォルトでは最初のページにしか表示されません。(改ページさせない設定は Tablix のプロパティにあります)

2ページ目以降も列ヘッダーを表示するために画面の項目を調べていくと一般的に Tablix のプロパティに「すべてのページにヘッダー行を表示する」というチェックボックスを見つけられると思いますので、そのチェックで解決すると思われがちなのですが、このチェックをつけても期待した動作にはなってくれません。(このプロパティがどんな動作をするかはわかりません)

改ページでも列ヘッダーを表示させるには以下の手順を踏む必要があります。

  1. Tablix をクリックして選択
  2. デザイナの下にあるグループペイン(行グループ、列グループのエリア)の「右上」にある「▼」をクリック。(行グループ、列グループの下ではなく右側にあります)
  3. 「詳細設定モード」を選択
  4. 行グループの下に「(静的)」の項目が追加されるのでそれを選択。(列グループにも同様に表示されますが、列ヘッダーを表示させたい場合は行グループの方を選択します。選択するとデザイナ上の Tablix で左上のセルが選択されると思います)
  5. プロパティペインを開き(ない場合は表示メニューから「プロパティ ウインドウ」)、「KeepWithGroup」のプロパティを「After」に、「RepeatOnNewPage」のプロパティを「True」に設定します。
  6. プレビューで動作確認
]]>

Reporting Services をインストール後、サーバー名を変更したときの対処法

Reporting Services をインストールした時にいくつかの設定はインストール時のサーバー名を使用しているため、後でサーバー名を変更するとReporting Services が正常に動作しなくなります。

ここではサーバー名を変更した後に Reporting Services の設定を変更すべき個所を説明します。

【環境】

  • SQL Server 2008 R2

■参照データベースのサーバー名

Reporting Services インストール時は参照データベースのサーバー名がインストール時のサーバー名になっているのでそれを変更後サーバー名、または localhost に変更します。

  1. スタートメニューから「Microsoft SQL Server 2008 R2」⇒「構成ツール」⇒「Reporting Services 構成マネージャー」を選択
  2. 左のメニューから「データベース」を選択
  3. 右のビューから「データベースの変更」をクリック
  4. 「既存のレポート サーバー データベースを選択する」にチェック
  5. 「サーバー名」を新しいサーバー名にするか「localhost」に変更。正常に接続できるかテストする。
  6. レポート サーバー データベースの選択で「ReportServer」を選択
  7. 後はそのままウィザードをすすめる (構成に数分かかる場合があります)

 

他にはユーザーがデータソースなどでサーバー名を直接指定している場合はそれらをすべて変更する必要があります。

]]>

[SSAS] 名称などのディメンションの並び順を別の属性(列)の値をもとに並び替えるようにする

ディメンションを作成した直後は自分自身の属性の表示名称をもとに並び替えられるようになっているため、名前に関連する属性は文字コード順で並び替えられてしまいます。また、数値であっても文字列として並び替えられるので「1,10,11,12,2,3…」のようになってしまいます。

並び替えの変更で一番簡単なのはKeyColumnを変更し、Orderby をKeyにすることです。手順は以下のようになります。

少し手順が多いので箇条書きで書きます。

■キーによる並び替え設定手順

  1. 並び順を変更するディメンション(.dim)を開く
  2. 設定変更対象の属性を選択、プロパティを開く
  3. KeyColumns プロパティからキー列を開き、他の列の値で並び替えしたい列を右のリストに移動させる。複数の列選択可、上の項目ほど優先度が高い
  4. NameColumn を開き、表示名称を選択する
  5. OrderBy を「Key」に変更

以上の方法で別の列の値をもとに並び替えられるので確認してみてください。

上記の方法は簡単なのですが欠点が一つあり、キー項目を変えてしまっているため、キーを使用している箇所に影響が出る場合があります。たとえば、Reporting Services のレポートではフィルターをキーで管理しているため、レポートのフィルターで特定の値をフィルターで設定した後に、KeyColumns で設定した値が変更されてしまうと、レポートにフィルター設定が無効になってしまう場合があります。特に設定したキーが自動付番であったりすると確実に影響します。

 

そこで別な並び替えの設定としては「属性キー」を使用した並び替えを行う方法があります。こちらは対象属性のキーを変更しないため上記のように見た目の値が変更されていないにも関わらず内部のキーが変わってしまうという事態を防ぐことができます。ただし、データの持ち方はシステムそれぞれですので、どちらを採用するかは開発者の判断に任せます。

属性キーを使用した並び替えの設定は以下のようになります。

■属性キーによる並び替え設定手順

  1. 並び順を変更するディメンション(.dim)を開く
  2. 「属性リレーションシップ」のタブを選択
  3. 並び替えを変更する属性を右クリックして「新しい属性リレーションシップ」を選択
  4. 属性リレーションシップの作成ダイアログで「関連属性」の名前から並び替えの基準にしたい列(属性)を選択、OKボタンをクリック
  5. 「ディメンション構造」タブをクリック
  6. 並び替え変更対象の属性を選択し、プロパティを表示
  7. OrderBy を「AttributeKey」に変更
  8. OrderByAttribute から先ほど並び替え対象に選択した属性を選択

一応属性の少ないシンプルなディメンションであれば上記の手順で並び替えは可能なのですが、階層化されていたり、多くの属性が存在する場合は手順が複雑になるかもしれません。

 

【参考】

]]>

VBScript から ADO を使ったデータベース接続に必要な接続文字列

メモです。.NET で ADO.NET を使った時と接続文字列が違うので注意が必要ですね。

 

Windows 認証

Driver={SQL Server}; server=<サーバー名>; database=<データベース名>;

 

SQL Server 認証

Driver={SQL Server}; server=<サーバー名>; database=<データベース名>; uid=<ユーザー名>; pwd=<パスワード>;

 

Windows 認証と SQL Server 認証の違いはユーザー名とパスワードの指定があるかないかの違いだけで他は同じです。

]]>

SQL Server データベースの自動バックアップ

今まで SQL Server のデータベースのバックアップは SSIS や Windows タスクを使用したバックアップ SQL でやってたのですが、SQL Server Management Studio を使えば簡単にバックアップスケジュールを組めたんですね。

せっかくなのでその手順を簡単に書いておきます。

【環境】

  • SQL Server 2008 R2
  • Windows Server 2008 R2

【手順】

  1. SQL Server Management Studio を起動
  2. 対象データベースエンジンを開き、「管理」フォルダを展開
  3. 「メンテナンス プラン」を右クリックし、「新しい メンテナンス プラン」を選択
  4. 新しいメンテナンス プランで任意の名前を指定
  5. デザイン画面が表示されるので、ツールボックスから「データベースのバックアップ タスク」をデザイナー画面にドラッグ&ドロップ
  6. 配置したデータベースのバックアップ タスクをダブルクリック
  7. ダイアログが開くので、バックアップするデータベースの選択、バックアップファイルの出力先、追加、上書きなどを指定して OK をクリック。
  8. ビューの上にあるサブプランからカレンダーアイコンをクリック。
  9. ジョブ スケジュールのプロパティが開くので、バックアップを行うタイミングを任意に設定して OK をクリック

後は指定した時間に自動的にデータベースがバックアップされます。

ちなみにこのメンテナンスは内部では SQL Server エージェントのジョブを作成しており単にそれを実行しているので、ジョブを見てみると作成したバックアップ タスクが追加されていることがわかります。

]]>

SSIS で Shift_JIS で表現できない文字(文字コード)を含む CSV ファイルの読み書き

かなりピンポイントなメモです。

【読み込み】

Shift_JISで扱えない文字を Shift_JIS で保存するわけにはいかないので、通常は Unicode の形式で保存します。SSIS のフラット ファイル ソースでは Unicode ファイルの読み込みに対応しており、フラット ファイル接続マネージャーで「Unicode」にチェックを入れることによって読む込むことができます。Unicode といってもいくつか形式はありますが、「UTF-8」「UTF-16LE」での読込は確認しています。

【書き出し】

フラット ファイル変換先で Shift_JISに対応していない文字を Shift_JIS で書き出そうとすると必ずエラーになります。事前に Shift_JIS に対応していない文字を変換するか、Unicode などで保存する必要があります。

]]>

別コンピューターから SSIS パッケージを実行する方法

メモです。SQL Server エージェントを登録する方法のプログラムで実行できました。

開発サーバーにしか SQL Server が入ってなく、SSIS パッケージもそこでしか実行できないので SQL Server エージェントに実行を任せています。

手順を簡単に書くと、

  1. SSIS プロジェクトでパッケージを作成
  2. SQL Server Management Studio から SQL Server データベース に接続し、SQL Server エージェント を起動 (今後常に使う場合は OS 起動時に常に起動させる設定にしておくといいです。)
  3. ジョブを作成し、ステップに SSIS パッケージ実行を追加。今回 SSIS パッケージはサーバー内のローカルフォルダにおいてあるので ファイル システムから SSIS パッケージを選択しました。
  4. ジョブを登録したら上記リンク先にあるプログラムでバッチ プログラムを作成。接続文字列やパッケージ名は環境に合わせて変えてください。(「jobConnection = new SqlConnection("Data Source~」の部分と「jobParameter.Value = "RunSSISPackage";」の部分)
  5. 後は実行して動作するか確認
]]>