出力として必要なデータ型を指定していません。1.XXX の形式で指定した順序で文字列を並べたいと想定しています。
これにアプローチするには、いくつかの方法があります。コンパクトなバージョンでは、0 から 100 までの数字を数回交差結合します。
;with Numbers (n) as
(
select 0 -- base case: 0
union all
select n + 1 from Numbers where n < 100 -- recursive case: numbers 1 to 100
)
select
cast (LV1.n as varchar) +
case LV2.n when 0 then '' else '.' + cast (LV2.n as varchar) end +
case LV3.n when 0 then '' else '.' + cast (LV3.n as varchar) end +
case LV4.n when 0 then '' else '.' + cast (LV4.n as varchar) end
from Numbers LV1
cross join Numbers LV2
cross join Numbers LV3
cross join Numbers LV4
where
LV1.n = 1
and
(
(LV2.n = 0 and LV3.n = 0 and LV4.n = 0) -- 1.0.0.0 is OK
or (LV2.n <> 0 and LV3.n = 0 and LV4.n = 0) -- 1.X.0.0 is OK
or (LV2.n <> 0 and LV3.n <> 0 and LV4.n = 0) -- 1.X.X.0 is OK
or (LV2.n <> 0 and LV3.n <> 0 and LV4.n <> 0) -- 1.X.X.X is OK
)
order by LV1.n, LV2.n, LV3.n, LV4.n
This example uses a recursive Common Table Expression (CTE) to generate the numbers 0 to 100. 次に、コードはこれらの数値を 4 回クロス結合して XXXX のパターンを作成します。
where 句は、最初の数値が 1 で、ゼロ値の後にゼロ以外の値がないすべてのケースに出力を制限します。
select はゼロ値をブランクに変換します。したがって、1.0.0.0 は「1」に変換され、1.1.0.0 は「1.1」に変換されます。
開発マシンで SQL Server 2008 R2 Developer Edition SSMS クエリ ウィンドウに対して実行すると、3 秒でデータが返され始めます。約 15 秒で 100 万件のレコードを返します。