创建包含其他存储过程的存储过程时会发生什么情况?



我目前正在运行一个 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

因此,在此创建 proc 语句中存在上述 17 个。

目前,CREATE PROC 查询为 53 分钟,并且还在不断增加。

当运行执行这 17 个存储过程的基本查询时,使用 PRINT 语句显示每个存储过程完成的时间,整个批处理大约需要 1 小时 10 分钟(给定或花费(才能运行。

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

我相信这里的问题是你的印象是你可以在存储过程中有批处理分隔符(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 中包含完整的语句。

相关内容

最新更新