[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. 後は実行して動作するか確認
]]>

SQL Server 構成マネージャー を起動しようとするとエラーが発生して起動できない対処法

64 bit 環境で SQL Server に関連するソフトウェアのインストールやアンインストールを繰り返していると SQL Server 構成マネージャー を起動しようとしたときに

----------------------------------------------------------------------
WMI プロバイダーに接続できません。権限がないかサーバーにアクセスできません。SQL Server 2005 以降のサーバーは、SQL Server 構成マネージャーでのみ管理できます。
無効なクラスです [0x80041010]
-------------------------------------------------------------------------

image

と表示されて起動できなくなってしまう場合があります。対処法についてはマイクロソフトの公式サイトに載っています。

基本的には上記リンク先のコマンドを管理者権限で起動したコマンド プロンプトで入力すればいいのですが、どうもパスが間違っているらしく、以下のように修正する必要があります。(もちろんインストールしたときのフォルダ設定によってパスが変わる可能性もあります。)

  • 誤:mofcomp "%programfiles(x86)%MicrosoftMicrosoft SQL Server100Sharedsqlmgmproviderxpsp2up.mof"
  • 正:mofcomp "%programfiles(x86)%Microsoft SQL Server100Sharedsqlmgmproviderxpsp2up.mof"

image

]]>

[VBScript][VBA] セルの入力項目にエラーがあるかどうかをチェックする

メモです。

通常セルに入力されている値を取得する場合は

<なんちゃら>.Cells(row, col).Value

で取得できますが、セルの入力項目にエラーがある場合、上記のプログラムでアクセスするとエラーになってしまいます。

セルの内容がエラーであるかどうかは以下のようにして事前にチェックすることができます。


Set objExcel = CreateObject("Excel.Application")
Set objSheet = <なんちゃら>
If objExcel.WorksheetFunction.IsError(objSheet.Cells(row, col)) Then
  ' エラーがあった場合の処理
Else
  ' エラーがなかった場合の処理
End If
]]>

[VBScript][VBA] Excel で入力されている一番下の行位置と一番右の列位置を取得する

メモです。

行位置

ActiveSheet.UsedRange.Rows(ActiveSheet.UsedRange.Rows.Count).Row

列位置

ActiveSheet.UsedRange.Columns(ActiveSheet.UsedRange.Columns.Count).Column

.NET Framework で Microsoft.Office.Interop.Excel を使う場合でも同様に取得できます。

]]>

Excel オブジェクトから結合されたセルの値を取得する

Excel で「A1」から「B2」の4セルが結合され値が設定されている場合に、Cells プロパティから4セルどこを指定しても値を取りたいと思うことがあると思いますが、実際に値の愛っているセルは結合されたセルの一番左上のセルのみであるため、ほかの位置を指定すると空の値が返ります。

【例】

A1:B2の結合セルに「10」が入力されていた場合

  • sheet.Cells(1, 1) ⇒ 10
  • sheet.Cells(1, 2) ⇒ “”
  • sheet.Cells(2, 1) ⇒ “”
  • sheet.Cells(2, 2) ⇒ “”

結合セルのどこを指定しても値を取得したい場合は「MergeArea」プロパティを使うと有効です。MergeArea.Cells の位置は必ず (1, 1)にして値が必ず存在するセルを指定します。

【例】

value = sheet.Cells(2, 2).MergeArea.Cells(1, 1).Value   ‘ = 10

]]>