MW211 EXIT

devlog
MSSQL/自動採番(SEQUENCE)
2015年05月29日
連番などの自動採番には属性に「IDENTIFY」を設定するやり方があるが
「SEQUENCE」を使用するやり方もある

まず、基本的な定義は以下の通り。(1から+1していく)
┌──────────────────────────────────────┐
│CREATE SEQUENCE 連番 AS int                                                 │
│    START WITH 1                                                            │
│    INCREMENT BY 1;                                                         │
└──────────────────────────────────────┘

そして使用方法は以下のような感じ
┌──────────────────────────────────────┐
│SELECT NEXT VALUE FOR 連番;                                                 │
└──────────────────────────────────────┘
これを(SELECT以外を)、INSERT文で代入してやればよい。

現在値を確認するには「sys.sequences」の中を覗くとよい。
┌──────────────────────────────────────┐
│SELECT current_value                                                        │
│    FROM sys.sequences                                                      │
│    WHERE name = '連番';                                                    │
└──────────────────────────────────────┘

現在値を変更するには以下のような感じにすればよい。(以下は、現在値を「1」にする)
┌──────────────────────────────────────┐
│ALTER SEQUENCE 連番 RESTART WITH 1;                                         │
└──────────────────────────────────────┘

「1~100」の間で循環させる場合には以下のような感じに定義してあげる。
┌──────────────────────────────────────┐
│CREATE SEQUENCE 連番 AS int                                                 │
│    START WITH 1                                                            │
│    INCREMENT BY 1                                                          │
│    MINVALUE 1                                                              │
│    MAXVALUE 100                                                            │
│    CYCLE;                                                                  │
└──────────────────────────────────────┘

「IDENTIFY」と比較しての利点となれば
これは複数の表で共用できるというところであろう。
つまり、連番が特定の表から独立した感じになる。
分類:MSSQL
MSSQL/リストア(タイムライン)
2015年05月28日
「SQL Server 2014 Management Studio」からバックアップファイルを
リストアする方法。

「オブジェクトエクスプローラー」(ツリー)上の
「データベース」もしくは「システムデータベース」で右クリックし
「データベースの復元」を選択し、ウインドウを開く。

「ソース」の「デバイス」を選択し、バックアップファイルを指定する。

後は、「OK」ボタンで実行するだけ。

・複数のDBを同時にリストアはできない模様
・時々、回線断などでエラーとなる場合があるが、その場合は、再度実行すればよい
・他でそのDBを使用している場合もエラーとなる(この場合も再実行)

バックアップファイル指定後、「転送先」に各種情報が表示されるが、
そこで「タイムライン」ボタンを押すと
バックアップ時点より前の日時に遡ってリストアすることができる。
分類:MSSQL
MSSQL/Profiler(2)使用方法
2015年05月27日
「SQL Server 2014 Management Studio」のメニューバーの「ツール」より
「SQL Server プロファイラー」を選択し起動させる。

すると「SQL Server 2014 Management Studio」の起動時と同様に接続先聞いてくるので
トレース対象の「SQL Server」に接続する。

トレースのプロパティ設定を聞いてくるので、任意のトレース名で設定を行う。
実行(設定)を行うと、トレースが実行される(Windowが開く)。
#アイコンバーの再生ボタンが押された形となる

後は、SQL文が実行されるのを監視するだけ。

終了したい場合には、停止ボタンを押す。

トレースのプロパティ設定時に、ファイルへの出力やテーブルへの出力も設定できる。

ファイルへ出力を設定すると「.trc」拡張子のファイルに出力される。
後で、本ファイルをダブルクリックすれば「SQL Server Profiler」が起動し
トレースWindowでトレースされた内容が表示される。
#本画面の場合、再生ボタンに当たるものを実行すると
  その内容で再生(再実行)されるらしい
分類:MSSQL
MSSQL/Profiler(1)概要
2015年05月26日
監視機能である「SQL Server Profiler」とは。

この機能は、「SQL Server」に対する命令(SQL文など)を
間に入ってトレースするものである。

これにより、どのようなSQL文が「SQL Server」側に渡ったのか確認できる。
一方で、間に入るということは、「SQL Server Profiler」が
情報を一次受けして「SQL Server」に取り次ぐ感じになるので性能が落ちる。
よって、本番環境ではあまり多用せず、
調査など特別な場合のみに限って用いた方がよい。
分類:MSSQL
MSSQL/VACUUM相当
2015年05月25日
MSSQLにPostgreSQLの「VACUUM」に相当する処理があるのか?必要なのか?

ない、必要ない。
分類:MSSQL
SQL/JOIN
2015年05月20日
単なる「JOIN」は「INNER JOIN」の略
分類:MSSQL
MSSQL/マッチング・後編(Ⅱ)
2015年05月14日
MERGE文はあきらめきれないあなたに。

【案1】CASE文で差分がなければ現状維持の値を代入する
┌──────────────────────────────────────┐
│MERGE INTO [旧表]                                                           │
│    USING [新表]                                                            │
│       ON [新表].[キー] = [旧表].[キー]                                     │
│    WHEN MATCHED THEN                                                       │
│        UPDATE SET [列]       = [新表].[列],                                │
│                   [更新日時] = CASE                                        │
│                                  WHEN [旧表].[列] = [新表].[列] THEN       │
│                                    [旧表].[更新日時]                       │
│                                  ELSE                                      │
│                                    getdate()                               │
│                                END                                         │
│    WHEN NOT MATCHED BY TARGET THEN                                         │
│        INSERT (                                                            │
│                [キー],                                                     │
│                [列],                                                       │
│                [更新日時]                                                  │
│            ) VALUES (                                                      │
│                [新表].[キー],                                              │
│                [新表].[列],                                                │
│                getdate()                                                   │
│            );                                                              │
└──────────────────────────────────────┘

【案2】まず重複するものを除いたからMERGEを行う
┌──────────────────────────────────────┐
│MERGE INTO [旧表]                                                           │
│    USING (                                                                 │
│        SELECT *                                                            │
│            FROM [新表]                                                     │
│            WHERE NOT EXISTS (                                              │
│                      SELECT *                                              │
│                          FROM [旧表]                                       │
│                          WHERE [旧表].[キー] = [新表].[キー]               │
│                            AND [旧表].[列]   = [新表].[列]                 │
│                  )                                                         │
│    ) AS [新表]                                                             │
│       ON [新表].[キー] = [旧表].[キー]                                     │
│    WHEN MATCHED THEN                                                       │
│        UPDATE SET [列]       = [新表].[列],                                │
│                   [更新日時] = getdate()                                   │
│    WHEN NOT MATCHED BY TARGET THEN                                         │
│        INSERT (                                                            │
│                [キー],                                                     │
│                [列],                                                       │
│                [更新日時]                                                  │
│            ) VALUES (                                                      │
│                [新表].[キー],                                              │
│                [新表].[列],                                                │
│                getdate()                                                   │
│            );                                                              │
└──────────────────────────────────────┘

【案2】が拡張性があってよさげだ。

※NULL値の比較に注意
分類:MSSQL
MSSQL/非NULL列の追加
2015年05月13日
┌──────────────────────────────────────┐
│ALTER TABLE [表] ADD [列] [int] NOT NULL;                                   │
└──────────────────────────────────────┘
「NOT NULL」制約の列を後から追加した場合、エラーとなる。
追加した列の初期値が「NULL」だからだ(矛盾してしまう。

なので、既定値付きなら問題ない。
┌──────────────────────────────────────┐
│ALTER TABLE [表] ADD [列] [int] NOT NULL DEFAULT 0;                         │
└──────────────────────────────────────┘

つまり、最初のやつは以下のような指定だったわけだ(これは矛盾している)。
┌──────────────────────────────────────┐
│ALTER TABLE [表] ADD [列] [int] NOT NULL DEFAULT NULL;                      │
└──────────────────────────────────────┘

でも、こういうことをやりたいケースというのは多々ある。

これを実現するには迂回する形で3ステップ必要となる。
┌──┬───────────────────────────────────┐
│(1) │ALTER TABLE [表] ADD [列] [int] NULL;                                 │
├──┼───────────────────────────────────┤
│(2) │UPDATE [表] SET [列] = 0;                                             │
├──┼───────────────────────────────────┤
│(3) │ALTER TABLE [表] ALTER COLUMN [列] [int] NOT NULL;                    │
└──┴───────────────────────────────────┘
  (1) ひとまずNULL許容属性で追加する
  (2) NULLじゃない値にする
  (3) NOT NULL制約をつける
分類:MSSQL
VB.net/実行ファイル名を変更
2015年05月12日
「bin\Release」もしくは「bin\Release」に生成される実行ファイル名を変更する方法。

もちろん、生成後に直接変更しても問題ないのだが、
最初からそのファイル名にするには。

「MyProject/アプリケーション」で「アセンブリ名」を
名づけたい実行ファイル名(拡張子は不要)にする。
分類:VB.net
VB.net/デバッグログ
2015年05月11日
【ダイアログに表示】
┌──────────────────┬───────────────────┐
│MsgBox                              │ダイアログに出力                      │
│MessageBox.Show                     │                                      │
└──────────────────┴───────────────────┘
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
【出力ウインドウに表示】
┌──────────────────┬───────────────────┐
│System.Diagnostics.Debug.Write      │出力ウィンドウに改行しないで出力      │
│System.Diagnostics.Trace.Write      │                                      │
├──────────────────┼───────────────────┤
│System.Diagnostics.Debug.WriteLine  │出力ウィンドウに改行して出力          │
│System.Diagnostics.Debug.Print      │                                      │
│System.Diagnostics.Trace.WriteLine  │                                      │
│System.Diagnostics.Trace.Print      │                                      │
├──────────────────┼───────────────────┤
│System.Diagnostics.Debug.WriteIf    │条件付きで                            │
│System.Diagnostics.Trace.WriteIf    │      出力ウィンドウに改行しないで出力│
├──────────────────┼───────────────────┤
│System.Diagnostics.Debug.WriteLineIf│条件付きで出力ウィンドウに改行して出力│
│System.Diagnostics.Trace.WriteLineIf│                                      │
└──────────────────┴───────────────────┘
  ※「.Debug.」はDebug時のみ出力(「.Trace.」はReleaseでも出力)
  ※出力ウインドウは「Ctrl+Alt+O」で表示できる
  ※イミディエイトウィンドウに出力されている場合は
    「ツール>オプション>デバッグ>全般」の
    「□出力ウィンドウの文字をすべてイミディエイトウィンドウにリダイレクトする」
    のチェックを外す
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
分類:VB.net
前へ 1 2 次へ