CTE代替临时表由于" INSERT EXEC语句不能嵌套"

时间:2014-04-11 08:24:39

标签: sql-server tsql sql-server-2005

当我尝试在父级sproc中使用子sproc时,我得到了:

An INSERT EXEC statement cannot be nested

因此,我开始在CTE中重复代码而不是调用子代sproc。这是代码:

SET @Sql = N'
;WITH MonthsAndYears AS
(
    SELECT 
        TOP (DATEDIFF(MONTH, @FromDate, @ToDate) + 1) 
        [TheMonth] = MONTH(DATEADD(MONTH, number, @FromDate)),
        [TheYear]  = YEAR(DATEADD(MONTH, number, @FromDate)),
        [Date]  = DATEADD(month, DATEDIFF(month, 0, DATEADD(MONTH, number, @FromDate)), 0)
    FROM [master].dbo.spt_values 
    WHERE [type] = N''P''
)
...

以前我用过:

CREATE TABLE #MonthsAndYears ([Month] INT, [Year] int, [Date] SMALLDATETIME)
INSERT INTO #MonthsAndYears EXEC Logi_GetMonthsAndYears @FromDate, @ToDate

并在我的后续cte代码中引用#MonthsAndYears(sproc与cte完全相同)。问题是当我使用没有临时表的cte方法时,查询执行得慢得多。为什么是这样?

1 个答案:

答案 0 :(得分:1)

这是SQL Server的已知限制。多年前,它一直被微软视为一种错误/改进。

http://connect.microsoft.com/SQLServer/feedback/details/294571/improve-insert-exec https://connect.microsoft.com/SQLServer/feedback/details/272133/cannot-have-nested-insert-exec

因此,您需要使用变通办法。本文讨论了一些解决方法:

How to Share Data between Stored Procedures