SQL Server から 12 か月の名前を表示したい。月の名前を一時テーブルに挿入し、そのテーブルでselectステートメントを実行する必要があります。そのため、12 か月の名前を挿入するには、12 の挿入テーブルを作成する必要がありました。だから私はグーグルを検索してより良い解決策を見つけ、それを手に入れました。
これがSQLステートメントです
WITH R(N) AS
(
SELECT 0
UNION ALL
SELECT N+1
FROM R
WHERE N < 12
)
SELECT LEFT(DATENAME(MONTH,DATEADD(MONTH,-N,GETDATE())),3) AS [month]
FROM R
上記のスクリプトは完全に機能しますが、私の問題は、それがどのように機能するのか理解できないことです。私はCTEで働いたことはありません。
だから教えて の意味は何ですか WITH R(N) AS
このSQLを見てください
SELECT LEFT(DATENAME(MONTH,DATEADD(MONTH,-N,GETDATE())),3) AS [month] FROM R
when above sql execute how it is getting value for -N ??
because here i have not set anything for -N ??
ですから、全体がどのように機能するかを理解するのを手伝ってください。かく
質問の第 2 段階
ただ見て、教えてください
;WITH months(MonthNumber) AS
(
SELECT 0
UNION ALL
SELECT MonthNumber+1
FROM months
WHERE MonthNumber < 12
)
なぜ下の部分が初めて実行されるのか、私には明らかではありません
SELECT 0
UNION ALL
SELECT MonthNumber+1
FROM months
WHERE MonthNumber < 12
そして2回目からはこの下の部分だけ実行
SELECT MonthNumber+1
FROM months
WHERE MonthNumber < 12
Unionを使用して2つのSQLステートメントを記述して実行すると、常に2つのSQL状態からデータが返されますが、特にこの場合は2回目から、この部分のみが実行される理由
SELECT MonthNumber+1
FROM months
WHERE MonthNumber < 12
基本的に、再帰手法を使用した CTE に慣れていないため、状況が明確になっていません。可能であれば、CTE 再帰がどのように機能するかについて説明してください。
DECLARE @TotaDays SMALLINT
DECLARE @Month VARCHAR(15)
DECLARE @Year SMALLINT
DECLARE @date DATETIME
SET @Month = 'January'
SET @Year = 2015
SET @date = '01 ' + @Month + ' ' + CONVERT(VARCHAR(4),@Year)
SET @TotaDays = 0
SELECT @TotaDays = DATEDIFF(DAY, @date, DATEADD(MONTH, 1, @date))
;WITH months(MonthNumber) AS
(
SELECT 1
UNION ALL
SELECT MonthNumber+1
FROM months
WHERE MonthNumber < @TotaDays
)
select * from months;