【问题标题】:What happens when a Stored Procedure is created that contains other stored procedures?当创建包含其他存储过程的存储过程时会发生什么?
【发布时间】:2018-06-18 11:04:52
【问题描述】:

我目前正在运行 CREATE PROC 查询来创建一个主存储过程,该过程依次运行 17 个其他存储过程。每个都被一个 INSERT INTO 语句夹在中间,将一行放入审计表中,显示 sproc 在它之前运行的日期时间,然后在它之后添加一个 UPDATE 语句,添加 sproc 完成运行的日期时间。例如;

------------------------------------------------------ STEP 1------------------------------------------------------

INSERT INTO [audit].[Marketing_Prefs_JobRun]
(
[Run_Step],
[Run_Start]
)
VALUES
(
1, -- Run_Step - int
GETDATE() -- Run_Start - datetime
)
GO

EXEC [dbo].[sp_Step_01_Refresh_Branch_4_Quotes]
GO

UPDATE [audit].[Marketing_Prefs_JobRun]
SET
[audit].[Marketing_Prefs_JobRun].[Run_End] = GETDATE()
WHERE [audit].[Marketing_Prefs_JobRun].[Run_Step] = 1
    AND (
            CAST([Run_Start] AS DATE) = CAST(GETDATE() AS DATE)
                AND [Run_End] IS NULL
        )
GO

所以在这个 create proc 语句中有以上 17 个。

目前 CREATE PROC 查询为 53 分钟,还在计数中。

在运行执行这 17 个存储过程的基本查询时,使用 PRINT 语句显示每个存储过程的完成时间,整个批处理大约需要 1 小时 10 分钟(或多或少)来运行。

用于创建我的主存储过程的 CREATE PROC 查询是否实际运行在所有 17 个将被调用的存储过程的代码中?我很难想象为什么创建程序需要这么长时间。

【问题讨论】:

  • CREATE PROC 通常应该很快。您的 SP 的 CREATE 声明是什么?你忘了包括它。
  • @Larnu 这简直就是; CREATE PROC [audit].Marketing_Prefs_Run_Log AS SET NOCOUNT ON 然后上面主要问题中的 17 个代码块。
  • 上面的代码中有批处理分隔符 (GO)。如果您的 SP 中有上述代码,那么您的 SP only 将包含 INSERT INTO [audit].[Marketing_Prefs_JobRun] ( [Run_Step], [Run_Start] ) VALUES ( 1, -- Run_Step - int GETDATE() -- Run_Start - datetime )
  • 是的,当我将 select 语句版本转换为 sproc 时,我才意识到我应该把这些去掉。我已经把它们全部换成了 ;它会立即创建存储空间。小学生错误!

标签: sql-server stored-procedures


【解决方案1】:

我认为这里的问题是您的印象是您可以在存储过程中使用批处理分隔符 (GO)。不是这种情况。因此,当您在上述 SQL 之前运行 CREATE PROC [audit].Marketing_Prefs_Run_Log AS SET NOCOUNT ON 时,第一批在第一条 INSERT 语句之后结束。之后,所有剩余的 SQL 都会运行。

举个简单的例子:

USE Sandbox;
GO

CREATE TABLE sample_tbl (ID int);
GO

CREATE PROC sample_sp AS

    INSERT INTO sample_tbl
    VALUES (1);
    GO
    INSERT INTO sample_tbl
    VALUES (2);
--GO --Commented out as we're already out of the SP CREATE batch.
--If you removed the first GO, then you'd need to uncomment this one so
--that the following statements are put inside the SP.
SELECT *
FROM sample_tbl; --Note the value 2 is in there

EXEC sample_sp;

SELECT *
FROM sample_tbl; --note the values are 2,1
GO

DROP TABLE sample_tbl;

您需要删除您的 GO 运算符才能在您的 SP 中包含完整的语句。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-31
    • 1970-01-01
    • 2023-04-04
    相关资源
    最近更新 更多