MW211 EXIT

devlog
MSSQL/時間を区切る
2015年06月25日
深夜残業は「22:00」以降と決まっているのだけれども
[残業開始日時]がまちまちで、[残業分]を「22:00」を境に
二つ([普通残業分]と[深夜残業分])に区切る方法。
┌──────────────────────────────────────┐
│SELECT CASE                                                                 │
│         WHEN [残業分] > DATEDIFF(MINUTE,                                   │
│                                  [残業開始日時],                           │
│                                  DATEADD(HOUR,                             │
│                                          22,                               │
│                                          CONVERT(datetime,                 │
│                                                  CONVERT(date,             │
│                                                          [残業開始日時]))))│
│         THEN                                                               │
│           DATEDIFF(MINUTE,                                                 │
│                   [残業開始日時],                                          │
│                   DATEADD(HOUR,                                            │
│                           22,                                              │
│                           CONVERT(datetime,                                │
│                                   CONVERT(date,                            │
│                                           [残業開始日時]))))               │
│         ELSE                                                               │
│           [残業分]                                                         │
│       END AS [普通残業分]                                                  │
│       CASE                                                                 │
│         WHEN [残業分] > DATEDIFF(MINUTE,                                   │
│                                  [残業開始日時],                           │
│                                  DATEADD(HOUR,                             │
│                                          22,                               │
│                                          CONVERT(datetime,                 │
│                                                  CONVERT(date,             │
│                                                          [残業開始日時]))))│
│         THEN                                                               │
│           [残業分] - DATEDIFF(MINUTE,                                      │
│                               [残業開始日時],                              │
│                               DATEADD(HOUR,                                │
│                                       22,                                  │
│                                       CONVERT(datetime,                    │
│                                               CONVERT(date,                │
│                                                       [残業開始日時]))))   │
│         ELSE                                                               │
│           0                                                                │
│       END AS [深夜残業分]                                                  │
│    FROM [表];                                                              │
└──────────────────────────────────────┘
分類:MSSQL
MSSQL/数値と文字の混在並び替え
2015年06月24日
[親]と[子]の二列(二階層)になっていて、それぞれ文字列型なのだが
場合によっては[子]が数値要素だけの場合、
数値としてソートをかけたいする(そうしないと「10」が「2」の前に来て格好悪い)

というこで、出し分けるSQL文は以下の通り
┌──────────────────────────────────────┐
│SELECT [主表].[親],                                                         │
│       [主表].[子],                                                         │
│    FROM [表] AS [主表]                                                     │
│    ORDER BY [主表].[親] ASC,                                               │
│             CASE                                                           │
│               WHEN EXISTS (                                                │
│                        SELECT *                                            │
│                            FROM [表] AS [調査表]                           │
│                            WHERE [調査表].[親] = [A].[親]                  │
│                              AND (ISNUMERIC([調査表].[子]) = 0             │
│                                OR ([調査表].[子] LIKE '0%'                 │
│                                AND [調査表].[子] <> '0'))                  │
│                    ) THEN                                                  │
│                 [主表].[子]                                                │
│               ELSE                                                         │
│                 FORMAT(CAST([主表].[子] AS int), '00000000')               │
│             END ASC;                                                       │
└──────────────────────────────────────┘
「0001」とかについては文字列として並び替えるおまけつき(しかも「0」だけは除く)
分類:MSSQL
MSSQL/日時型の生成
2015年06月10日
年、月といったint型からdate型もしくはdatetime型を生成する方法。

date型を生成。
┌──────────────────────────────────────┐
│SELECT DATEFROMPARTS(年, 月, 日);                                           │
└──────────────────────────────────────┘

datetime型を生成。
┌──────────────────────────────────────┐
│SELECT DATETIMEFROMPARTS(年, 月, 日, 時, 分, 秒, ミリ秒);                   │
└──────────────────────────────────────┘
分類:MSSQL
MSSQL/日付を年度に変換
2015年06月08日
泥臭くやるしかないみたい(そもそも年度は統一されてないし)

以下は四月始まりの年度の場合。
┌──────────────────────────────────────┐
│SELECT [日付],                                                              │
│       CASE                                                                 │
│         WHEN MONTH([日付]) < 4 THEN YEAR([日付]) - 1                       │
│         ELSE                        YEAR([日付])                           │
│       END AS [年度]                                                        │
│    FROM [表];                                                              │
└──────────────────────────────────────┘
分類:MSSQL
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
前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 次へ