MW211 EXIT

devlog
MSSQL/generate_series()
2015年02月15日
PostgreSQLには、自動で連番テーブルを作成してくれる「generate_series()」という
便利な関数があるが、MSSQLにはない。

ということで、自前で作ると以下のような感じとなる。
┌──────────────────────────────────────┐
│CREATE FUNCTION [dbo].[generate_series] (                                   │
│    @引数開始               int,                                            │
│    @引数終了               int,                                            │
│    @引数増分               int = 1                                         │
│) RETURNS @結果 table (                                                     │
│    [generate_series]       int                                             │
│)                                                                           │
│AS                                                                          │
│BEGIN                                                                       │
│    DECLARE @値             int;                                            │
│    DECLARE @増分           int;                                            │
│    SET @値   = CASE                                                        │
│                  WHEN @引数開始 IS NULL THEN 1                             │
│                  ELSE                        @引数開始                     │
│                END;                                                        │
│    SET @増分 = CASE                                                        │
│                  WHEN @引数増分 IS NULL OR @引数増分 = 0 THEN 1            │
│                  ELSE                                         @引数増分    │
│                END;                                                        │
│    IF SIGN(@増分) =  1 AND @引数開始 > @引数終了                           │
│        RETURN;                                                             │
│    IF SIGN(@増分) = -1 AND @引数開始 < @引数終了                           │
│        RETURN;                                                             │
│    WHILE (1 = 1)                                                           │
│    BEGIN                                                                   │
│        INSERT INTO @結果([generate_series]) VALUES (@値);                  │
│        SET @値 = @値 + @増分;                                              │
│        IF SIGN(@増分) =  1 AND @値 > @引数終了                             │
│            BREAK;                                                          │
│        IF SIGN(@増分) = -1 AND @値 < @引数終了                             │
│            BREAK;                                                          │
│    END;                                                                    │
│    RETURN;                                                                 │
│END;                                                                        │
└──────────────────────────────────────┘
分類:MSSQL