【问题标题】:CTE instead of temp table due to "An INSERT EXEC statement cannot be nested"由于“无法嵌套 INSERT EXEC 语句”,CTE 而不是临时表
【发布时间】:2014-04-11 08:24:39
【问题描述】:

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

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 tsql sql-server-2005


    【解决方案1】:

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

    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

    【讨论】:

    • 是的,我知道这一点,谢谢。找到了解决方案 - 我刚刚为数据创建了一个专用表并将其填充到一个非常大的日期。我会接受您的回答,因为它可能会为其他人指明正确的方向。
    猜你喜欢
    • 2014-07-07
    • 1970-01-01
    • 2013-05-17
    • 2016-05-02
    • 2017-10-18
    • 2019-11-12
    • 2020-01-21
    • 2018-03-20
    相关资源
    最近更新 更多