MW211 EXIT

devlog
MSSQL/特定の列が更新されたか
2014年11月07日
トリガにて、特定の列が更新された場合に発動するように判定するには
「UPDATE()」を使う。
┌──────────────────────────────────────┐
│CREATE TRIGGER [dbo].[トリガ] ON [データベース].[dbo].[テーブル]            │
│    AFTER UPDATE                                                            │
│AS                                                                          │
│BEGIN                                                                       │
│    IF UPDATE([列])                                                         │
│    BEGIN                                                                   │
│        SQL文;                                                              │
│    END;                                                                    │
│END;                                                                        │
└──────────────────────────────────────┘
但し、これは、その列がUPDATE文の対象だった場合に漏れなく発動し
内容に変化があったか否かは気にしない(同じ値で更新しても発動する)。

ということで、内容が変更された場合に限定するのは以下のような感じとなる。
┌──────────────────────────────────────┐
│CREATE TRIGGER [dbo].[トリガ] ON [データベース].[dbo].[テーブル]            │
│    AFTER UPDATE                                                            │
│AS                                                                          │
│BEGIN                                                                       │
│    IF (SELECT [列] FROM inserted) <> (SELECT [列] FROM deleted)            │
│    BEGIN                                                                   │
│        SQL文;                                                              │
│    END;                                                                    │
│END;                                                                        │
└──────────────────────────────────────┘
分類:MSSQL
MSSQL/自動採番トリガ
2014年11月03日
主キーが「ID,No」で、「ID」ごとに「No」を自動採番するトリガ。
#NULL以外に任意の指定があればそちらを優先
┌──────────────────────────────────────┐
│CREATE TRIGGER [dbo].[トリガNo自動採番] ON [データベース].[dbo].[表]        │
│    INSTEAD OF  INSERT                                                      │
│AS                                                                          │
│    INSERT INTO [データベース].[dbo].[表]                                   │
│        (                                                                   │
│            [ID],                                                           │
│            [No],                                                           │
│            [列]                                                            │
│        )                                                                   │
│        SELECT [ID],                                                        │
│               CASE                                                         │
│                 WHEN [No] IS NULL THEN                                     │
│                     ISNULL(                                                │
│                         (SELECT MAX([別表].[No])                           │
│                              FROM [データベース].[dbo].[表] AS [別表]      │
│                              WHERE [別表].[ID] = inserted.[ID]),           │
│                         0                                                  │
│                     ) + ROW_NUMBER() OVER(ORDER BY [列] ASC)               │
│                 ELSE                                                       │
│                     [No]                                                   │
│               END,                                                         │
│               [列]                                                         │
│            FROM inserted;                                                  │
└──────────────────────────────────────┘
INSERTされる行が一行のみであれば「ROW_NUMBER() OVER(ORDER BY [列] ASC)」は
「1」で代用できる(SELECTによるINSERTの場合は複数行も想定される)

「ROW_NUMBER() OVER(ORDER BY [列] ASC)」で並び順に困った場合には、
「ROW_NUMBER() OVER(ORDER BY (SELECT 1))」って指定でもいいみたい。

但し、SELECTによるINSERTの場合はORDER BY句が効かないので
意図した追加順になるとは限らない。
分類:MSSQL
MSSQL/既定のインスタンスとは
2014年11月01日
MSSQLのインストールにおいて、以下の選択がある
・既定のインスタンス
・名前付きのインスタンス
→「既定のインスタンス」はPC一台につき、一つしか設定できない。

各種プログラムからは、サーバ名について「コンピュータ名\インスタンス名」で
接続を行うが、以下の場合、「コンピュータ名」のみで接続することも可能である。
(1) 「既定のインスタンス」がある場合
    (「名前付きのインスタンス」の有無に関わらずこちらが優先される)
(2) 「名前付きのインスタンス」が一つのみインストールされている場合
→「名前付きのインスタンス」が複数インストールされていると
  「コンピュータ名」のみでは接続ができなくなる
分類:MSSQL
MSSQL/自然キーによる復活のトリガ
2014年10月24日
レコードを追加した時、削除レコード(削除済フラグがONのレコード)に
(自然キー基準で)該当するものがある場合に復活させるトリガは以下のような感じ。
┌──────────────────────────────────────┐
│CREATE TRIGGER [dbo].[トリガ] ON [QC工程表DB].[dbo].[表]                    │
│    INSTEAD OF INSERT                                                       │
│AS                                                                          │
│    MERGE INTO [QC工程表DB].[dbo].[表] AS [旧表]                            │
│        USING inserted AS [新表]                                            │
│        ON (                                                                │
│                [新表].[自然キー1] = [旧表].[自然キー1],                    │
│            AND [新表].[自然キー2] = [旧表].[自然キー2]                     │
│        )                                                                   │
│        WHEN MATCHED THEN                                                   │
│            UPDATE SET [列]           = [新].[列],                          │
│                       [削除済フラグ] = 0                                   │
│        WHEN NOT MATCHED THEN                                               │
│            INSERT (                                                        │
│                    [サロゲートキー],                                       │
│                    [自然キー1],                                            │
│                    [自然キー2],                                            │
│                    [列],                                                   │
│                    [削除済フラグ]                                          │
│                )                                                           │
│                VALUES (                                                    │
│                    (自動採番),                                             │
│                    [新].[自然キー1],                                       │
│                    [新].[自然キー2],                                       │
│                    [新].[列],                                              │
│                    [新].[削除済フラグ]                                     │
│                )                                                           │
│;                                                                           │
└──────────────────────────────────────┘
分類:MSSQL
MSSQL/自動採番をトリガで実現
2014年10月23日
主キー以外の項目で自動採番を実現するトリガは以下のような感じ。
(その項目にNULLが指定された場合のみ発動)
┌──────────────────────────────────────┐
│CREATE TRIGGER [dbo].[トリガ] ON [DB].[dbo].[表]                            │
│    INSTEAD OF INSERT                                                       │
│AS                                                                          │
│    INSERT INTO [DB].[dbo].[表]                                             │
│        (                                                                   │
│            [連番],                                                         │
│            [列]                                                            │
│        )                                                                   │
│        SELECT CASE WHEN [連番] IS NULL THEN                                │
│                        ISNULL(                                             │
│                            (SELECT MAX([別表].[連番])                      │
│                                 FROM [DB].[dbo].[表] AS [別表]             │
│                                 WHERE [表].[主キー] = inserted.[主キー]),  │
│                            0                                               │
│                        ) + 1                                               │
│                    ELSE                                                    │
│                        [連番]                                              │
│               END,                                                         │
│               [列]                                                         │
│            FROM inserted                                                   │
│;                                                                           │
└──────────────────────────────────────┘
分類:MSSQL
MSSQL/括弧を含む列名の変更
2014年10月21日
┌──────────────────────────────────────┐
│SP_RENAME '[DB名].[dbo].[表名].[旧列名]', '新列名', 'COLUMN';               │
└──────────────────────────────────────┘
上記とすべきところ、うっかり下記のように変更後の名称にも「[]」をつけてしまった。
┌──────────────────────────────────────┐
│SP_RENAME '[DB名].[dbo].[表名].[旧列名]', '[新列名]', 'COLUMN';             │
└──────────────────────────────────────┘

さぁ大変とばかりに是正しようとして以下を行うも、エラーとなる。
┌──────────────────────────────────────┐
│SP_RENAME '[DB名].[dbo].[表名].[[新列名]]', '新列名', 'COLUMN';             │
└──────────────────────────────────────┘

特殊文字だから「\」とかつけてみて…もダメ。
┌──────────────────────────────────────┐
│SP_RENAME '[DB名].[dbo].[表名].[\[新列名\]]', '新列名', 'COLUMN';           │
└──────────────────────────────────────┘

答えは以下の通り、「""」で囲えばよい。
┌──────────────────────────────────────┐
│SP_RENAME '[DB名].[dbo].[表名]."[新列名]"', '新列名', 'COLUMN';             │
└──────────────────────────────────────┘

ま、途方に暮れたら「Management Studio」で手動で直すこともできるんだけどね。
分類:MSSQL
MSSQL/IDENTIFY(自動連番)
2014年09月26日
【IDENTIFY(自動連番)の現在値を確認する方法】
┌──────────────────────────────────────┐
│DBCC CHECKIDENT (表名, NORESEED);                                           │
└──────────────────────────────────────┘
  次回採番されるのは「現在値+1」となる。
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
【IDENTIFY(自動連番)の現在値を列の最大値以上にする】
┌──────────────────────────────────────┐
│DBCC CHECKIDENT (表名);                                                     │
├──────────────────────────────────────┤
│DBCC CHECKIDENT (表名, RESEED);                                             │
└──────────────────────────────────────┘
  既に現在値が最大値以上の場合は変化なし。
  次回採番されるのは「現在値(最大値)+1」となる。
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
【IDENTIFY(自動連番)の現在値を任意の値にする】
┌──────────────────────────────────────┐
│DBCC CHECKIDENT (表名, RESEED, 値);                                         │
└──────────────────────────────────────┘
  最大値以下にも設定できるが、次回採番(INSERT)時に重複エラーとなる恐れあり。
  「Microsoft SQL Server Management Studio」で実行した場合、
  変更前の現在値を結果出力してから、変更が行われるので
  一見効果がないように錯覚しがち(もう一回実行すれば確認できる)。
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
【IDENTIFY(自動連番)の現在値を初期値にする】
┌──────────────────────────────────────┐
│DBCC CHECKIDENT (表名, RESEED, 0);                                          │
└──────────────────────────────────────┘
  次回採番されるのは「1」からとなる。
  「TRUNCATE TABLE」命令時にもこれと同様になる
分類:MSSQL
MSSQL/NULLから空文字の場合
2014年09月24日
NULLの場合、既定値を出力には以下のような感じとなる。
┌──────────────────────────────────────┐
│ISNULL(列, 既定値)                                                          │
└──────────────────────────────────────┘

これがNULLもしくは空文字としたい場合は、以下でOK。
┌──────────────────────────────────────┐
│ISNULL(NULLIF(列, ''), 既定値)                                              │
└──────────────────────────────────────┘
「NULLIF()」は値を比較して同一ならNULLを返す関数だ。
分類:MSSQL
MSSQL/データベース全体のSQL文作成
2014年09月20日
「Microsoft SQL Server Management Studio」にて
データベースを右クリック。

タスク>スクリプトの作成

●データベース全体とすべてのデータベースオブジェクトのスクリプトを作成

「スクリプト作成オプションの設定」にて「詳細設定」を押下。

「全般>スクリプトを作成するデータの種類」を「スキーマとデータ」にする。

後は適宜出力する。
分類:MSSQL
前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 次へ