【问题标题】:Issue regarding SQL Server 2005 CTE & FOR XML PATH('') usage有关 SQL Server 2005 CTE 和 FOR XML PATH('') 使用的问题
【发布时间】:2025-12-05 12:20:04
【问题描述】:

我已经通过 CTE 生成了月份编号,并尝试生成类似的输出 1,2,3,....30,31 通过使用 for xml 但我得到一个错误

这是我的完整脚本

;With CTEMonth As 
(Select 1 As Number
Union All
Select m.Number + 1 As Number
From CTEMonth m
Where m.Number <=30)  

DECLARE @cols AS NVARCHAR(MAX)
select @cols = STUFF((SELECT  ',' + m.Number
                    from CTEMonth m 
                    order by m.Number
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')
print @cols

我的 SQL 出了什么问题?请指导。谢谢

【问题讨论】:

  • 请先提供!请向我们提供完整和完整的错误消息 - 毕竟,我们既看不到您的屏幕,也看不到您的想法(目前) - 所以您需要向我们展示发生了什么......

标签: sql-server-2005 common-table-expression


【解决方案1】:

您需要将 DECLARE 移动到 CTE 之前

DECLARE @cols AS NVARCHAR(MAX);

;With CTEMonth As 
(Select 1 As Number
Union All
Select m.Number + 1 As Number
From CTEMonth m
Where m.Number <=30)  
select @cols = STUFF((SELECT  ',' + m.Number
                    from CTEMonth m 
                    order by m.Number
            FOR XML PATH(''), TYPE
            ).value(N'./text()[1]', 'NVARCHAR(MAX)') 
        ,1,1,'');

print @cols;

此外,递归 CTE 并不是生成集合的最有效方法 - 请参阅 hereherehere 了解更好的替代方法,例如数字表或日历表。

【讨论】:

  • 所以你能告诉我用例子生成一组数字的最佳方法是什么。谢谢
  • @Thomas 你没有在我提供的链接中看到任何示例吗?
最近更新 更多