当我尝试在父级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方法时,查询执行得慢得多。为什么是这样?
答案 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
因此,您需要使用变通办法。本文讨论了一些解决方法: