MW211 EXIT

devlog
SQL/完全外部結合でNULL比較
2014年11月08日
「FULL JOIN」で完全外部結合し、NULLも含めた比較をしたい場合。
「NULL = NULL」では「真」にならないという障壁がある。

つまり、以下のような感じになり、「ギ」の部分が「真」でないという誤算がある。

【一致比較の場合】    【不一致比較の場合】
┌─┬─┬─┬─┐    ┌─┬─┬─┬─┐
│  │a│b│ヌ│    │  │a│b│ヌ│
├─┼─┼─┼─┤    ├─┼─┼─┼─┤
│a│真│偽│偽│    │a│偽│真│ギ│
├─┼─┼─┼─┤    ├─┼─┼─┼─┤
│b│偽│真│偽│    │b│真│偽│ギ│
├─┼─┼─┼─┤    ├─┼─┼─┼─┤
│ヌ│偽│偽│ギ│    │ヌ│ギ│ギ│偽│
└─┴─┴─┴─┘    └─┴─┴─┴─┘

ということで、「ギ」を「真」にするSQL文は以下のようになる。

【一致比較の場合】
┌──────────────────────────────────────┐
│SELECT *                                                                    │
│    FROM [表1]                                                              │
│        FULL JOIN [表2]                                                     │
│          ON [表1].[キー] = [表2].[キー]                                    │
│    WHERE [表1].[列] = [表2].[列]                                           │
│       OR (([表1].[列] IS NULL) AND ([表2].[列] IS NULL));                  │
└──────────────────────────────────────┘

【不一致比較の場合】
┌──────────────────────────────────────┐
│SELECT *                                                                    │
│    FROM [表1]                                                              │
│        FULL JOIN [表2]                                                     │
│          ON [表1].[キー] = [表2].[キー]                                    │
│    WHERE [表1].[列] <> [表2].[列]                                          │
│       OR (([表1].[列] IS     NULL) AND ([表2].[列] IS NOT NULL))           │
│       OR (([表1].[列] IS NOT NULL) AND ([表2].[列] IS     NULL));          │
└──────────────────────────────────────┘

もっと簡単な方法がありそうな気もするが、原始的な方法であれば上記の通りとなる。
分類:SQL
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
アクセス用語集
2014年11月06日
┌──────────────┬─────┬─────────────────┐
│一般的な大分類              │参照      │更新                              │
│                            │読込      │書込                              │
├──────────────┼─────┼─────┬─────┬─────┤
│ファイルアクセスの分類      │読込      │書込      │上書      │削除      │
│                            │READ      │WRITE     │REWRITE   │DELETE    │
├──────────────┼─────┼─────┼─────┼─────┤
│DBアクセス(SQL文)の分類     │          │追加      │変更      │削除      │
│                            │          │挿入      │更新      │削除      │
│                            │READ      │WRITE     │REWRITE   │DELETE    │
│                            │SELECT    │INSERT    │UPDATE    │DELETE    │
│                            ├─────┼─────┴─────┼─────┤
│                            │          │併合                  │削除      │
│                            │SELECT    │MERGE                 │DELETE    │
│                            │SELECT    │UPSERT                │DELETE    │
└──────────────┴─────┴───────────┴─────┘
分類:設計
iPhone/favicon的なものを設定する
2014年11月04日
「apple-touch-icon.png」という名前のpngファイルを
ルートフォルダにおけばいい。

サイズはiOSのバージョンごとに適当に縮小してくれる。
透過は効かないらしい(黒扱いになる)。

なお、サブフォルダにおいてもすべて
ルートフォルダの「apple-touch-icon.png」が適用される。

個別に「apple-touch-icon.png」を変更したい場合には、
HTMLのヘッダに以下のような感じで画像の指定を記述すればよい。
┌──────────────────────────────────────┐
│<link rel="apple-touch-icon" href="images/apple-favicon.png">               │
└──────────────────────────────────────┘
分類:iPhone
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
ExcelVBA/Gotoの謎
2014年11月02日
「Application.Goto」が、Excelファイルを開き直すと
なぜか「Application.GoTo」(Tが大文字)になるファイルがある。

そのファイルは「Goto」と入力すると、ファイルを閉じるまでは
おとなしく「Goto」でいてくれるのだけど、ファイルを開き直すと「GoTo」になる。
「GoTo」と入力してもその瞬間は「Goto」になるくせにだ。

VisualStudioの誤認?いやいや参照設定の優先順位とかの問題?
分類:ExcelVBA
MSSQL/既定のインスタンスとは
2014年11月01日
MSSQLのインストールにおいて、以下の選択がある
・既定のインスタンス
・名前付きのインスタンス
→「既定のインスタンス」はPC一台につき、一つしか設定できない。

各種プログラムからは、サーバ名について「コンピュータ名\インスタンス名」で
接続を行うが、以下の場合、「コンピュータ名」のみで接続することも可能である。
(1) 「既定のインスタンス」がある場合
    (「名前付きのインスタンス」の有無に関わらずこちらが優先される)
(2) 「名前付きのインスタンス」が一つのみインストールされている場合
→「名前付きのインスタンス」が複数インストールされていると
  「コンピュータ名」のみでは接続ができなくなる
分類:MSSQL
前へ 1 2 次へ