🎙️

Hello World あたたたた T-SQL編

に公開

この記事は Hello World あたたたた Advent Calendar 2025 シーズン3の17日目の記事です。

SQLについては、すでにPL/pgSQL編が投稿されていますが、本記事では、Microsoft SQL Serverで使用されるT-SQLに焦点を当てつつ、SELECTのみでそれっぽく表現するアプローチをとってみました。

コード

WITH atatatata (hako) AS (
    SELECT
        CAST('' AS varchar(max))
    UNION ALL
    SELECT
        hako +
            CASE ROUND(RAND(CHECKSUM(NEWID())), 0)
            WHEN 0 THEN 'あ' ELSE 'た' END
    FROM
        atatatata
    WHERE
        hako NOT LIKE '%あたたたた'
)

SELECT * FROM atatatata WHERE hako LIKE '%あたたたた'
UNION ALL
SELECT 'お前はもう死んでいる'

OPTION (MAXRECURSION 0)

/*
hako
------------------------------------------------------
あたたあたあたあああたあたあああたたああたああたたたた
お前はもう死んでいる          

(2 行に影響しました)
*/

解説

繰り返しのために再帰CTEを使用しています。

中盤のCASE式、

CASE ROUND(RAND(CHECKSUM(NEWID())), 0)
WHEN 0 THEN 'あ' ELSE 'た' END

にて、'あ', 'た'をランダムに選出しますが、ここで単純にRAND()とすると全部同じ値になってしまうので注意が必要です。なお、RAND(CHECKSUM(NEWID()))という部分はChatGPTに教えてもらいました。

PL/pgSQL編で言及されている通り、「改行せずに標準出力へ書き込む」機能はSQL Serverにもないため、本記事では、途中経過の出力は諦め、2行の結果となるテーブル(ビュー)で表現しています。

最後のOPTION (MAXRECURSION 0)は、デフォルトの再帰回数上限が100回のため、そのままだと制限以内に「~あたたたた」を生成しそこねたときにエラーになってしまいます。そのため、0(無制限)を設定しています。

Discussion