SQL 服务器 - 由于"An INSERT EXEC statement cannot be nested",CTE 而不是临时表



当我尝试在父存储过程中使用子存储过程时,我得到了:

An INSERT EXEC statement cannot be nested

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

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(存储过程与cte完全相同)。问题是,当我使用没有临时表的cte方法时,查询执行速度要慢得多。为什么会这样?

这是SQL Server的一个已知限制。许多年前,微软就曾将其视为一个缺陷/改进。

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

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

如何在存储过程之间共享数据

最新更新