我想从 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 ??
所以请任何人帮助我了解整个事情是如何运作的。谢谢
我的第二阶段问题
看看然后告诉我
;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
从第二次开始,仅执行以下部分
SELECT MonthNumber+1
FROM months
WHERE MonthNumber < 12
每当我们使用 Union 编写两个 sql 语句并执行时,它总是从两个 sql 状态返回数据,但特别是在这种情况下,从第二次开始,为什么只执行下面的部分
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;