当我尝试在父存储过程中使用子存储过程时,我得到了:
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
因此,您需要使用变通方法。本文讨论了一些解决方法:
如何在存储过程之间共享数据