想从sql server显示12个月的名字

Tho*_*mas 8 sql t-sql sql-server

我想从sql server显示12个月的名字.我虽然要在temp表中完成插入月份名称,然后在该表上激活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
Run Code Online (Sandbox Code Playgroud)

上面的脚本工作得很好但我的问题是我只是不明白它是如何工作的.我从不和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 ??
Run Code Online (Sandbox Code Playgroud)

所以请任何人帮助我理解整个事情是如何运作的.thaks

我的第二阶段问题

只是看看并告诉我

;WITH months(MonthNumber) AS
(
    SELECT 0
    UNION ALL
    SELECT MonthNumber+1 
    FROM months
    WHERE MonthNumber < 12
)
Run Code Online (Sandbox Code Playgroud)

我不清楚为什么只有第一次下面的部分执行

SELECT 0
UNION ALL
SELECT MonthNumber+1 
FROM months
WHERE MonthNumber < 12
Run Code Online (Sandbox Code Playgroud)

并且从第二次开始只执行以下部分

SELECT MonthNumber+1 
FROM months
WHERE MonthNumber < 12
Run Code Online (Sandbox Code Playgroud)

每当我们使用Union编写两个sql语句并执行时,总是从两个sql状态返回数据,但特别是在这种情况下从第二次开始,为什么只有这个下面的部分执行

SELECT MonthNumber+1 
FROM months
WHERE MonthNumber < 12
Run Code Online (Sandbox Code Playgroud)

基本上我不熟悉使用递归技术的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;
Run Code Online (Sandbox Code Playgroud)

Tar*_*ryn 14

With R(N)是一个公用表表达式.来自MDSN:

公用表表达式(CTE)可以被认为是在单个SELECT,INSERT,UPDATE,DELETE或CREATE VIEW语句的执行范围内定义的临时结果集.CTE类似于派生表,因为它不作为对象存储,并且仅在查询期间持续.与派生表不同,CTE可以是自引用的,并且可以在同一查询中多次引用.

R是您要生成的结果集(或表)的名称.这Nmonth数字.

该CTE特别是递归公用表表达式.来自MSDN:

公共表表达式(CTE)提供了能够引用自身的显着优点,从而创建递归CTE.递归CTE是重复执行初始CTE以返回数据子集直到获得完整结果集的CTE.

使用CTE时,我的建议是更具描述性的名称.因此,对于您的示例,您可以使用以下内容:

;WITH months(MonthNumber) AS
(
    SELECT 0
    UNION ALL
    SELECT MonthNumber+1 
    FROM months
    WHERE MonthNumber < 12
)
select *
from months;
Run Code Online (Sandbox Code Playgroud)

在我的版本中,months是您生成的结果集的名称,monthnumber值是值.这将生成0-12的月份数列表(请参阅演示).

结果:

| MONTHNUMBER |
---------------
|           0 |
|           1 |
|           2 |
|           3 |
|           4 |
|           5 |
|           6 |
|           7 |
|           8 |
|           9 |
|          10 |
|          11 |
|          12 |
Run Code Online (Sandbox Code Playgroud)

然后紧接着的SELECT语句是使用CTE结果集的值来获取月份名称.

最终查询(参见演示):

;WITH months(MonthNumber) AS
(
    SELECT 0
    UNION ALL
    SELECT MonthNumber+1 
    FROM months
    WHERE MonthNumber < 12
)
SELECT LEFT(DATENAME(MONTH,DATEADD(MONTH,-MonthNumber,GETDATE())),3) AS [month]
FROM months;
Run Code Online (Sandbox Code Playgroud)


小智 7

此查询是获取所有月份名称和月份否

SELECT DATENAME(MONTH, DATEADD(MM, s.number, CONVERT(DATETIME, 0))) AS [MonthName], 
MONTH(DATEADD(MM, s.number, CONVERT(DATETIME, 0))) AS [MonthNumber] 
FROM master.dbo.spt_values s 
WHERE [type] = 'P' AND s.number BETWEEN 0 AND 11
ORDER BY 2
Run Code Online (Sandbox Code Playgroud)