我目前正在运行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个存储过程的代码?我正在努力想象为什么花了这么长时间来创建这个程序。
答案 0 :(得分: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中包含完整声明。