如何在存储过程中插入多个begin end

How to insert multiple begin end inside stored procedure

我意识到我不能在存储过程中使用 GO。

我有多个进程需要删除视图然后创建视图等。

如何创建存储过程而不出错?

基本上,这不是一个嵌套过程,而是从上到下的过程,因为我正在删除视图,创建视图,然后再创建表。

底部是两个进程的基本结构,但我至少会有 10+ 个具有相似模式的进程。

CREATE PROCEDURE Create_Views_Tables_Nov2021

AS
BEGIN
set nocount on

begin
    begin
        drop view [dbo].[vw_tblSage_GLDETAIL_0001] 
    end

begin
    CREATE VIEW [dbo].[vw_tblSage_GLDETAIL_0001]  
    AS
    SELECT *  FROM [dbo].[tblSage_GLDETAIL_1_1_Stage]
    union 
    SELECT *  FROM [dbo].[tblSage_GLDETAIL_1_2_Stage]
end

end

BEGIN...END 不是批次分隔符。 T-SQL 没有内置的批次分隔符(GO 不是 T-SQL 的一部分)。如果你想 运行 在他们自己的批次中的语句,你将不得不通过 sys.sp_executesql.

执行它们来使用延迟语句
CREATE PROCEDURE dbo.Create_Views_Tables_Nov2021

AS
BEGIN
    SET NOCOUNT ON;

    EXEC sys.sp_executesql N'DROP VIEW [dbo].[vw_tblSage_GLDETAIL_0001];';

    DECLARE @SQL nvarchar(MAX),
            @CRLF nchar(2) = NCHAR(13) + NCHAR(10);
    SET @SQL = N'CREATE VIEW [dbo].[vw_tblSage_GLDETAIL_0001]' + @CRLF +
               N'AS' + @CRLF +
               N'SELECT *  FROM [dbo].[tblSage_GLDETAIL_1_1_Stage]' + @CRLF +
               N'UNION --Should this not be UNION ALL?' + @CRLF +
               N'SELECT *  FROM [dbo].[tblSage_GLDETAIL_1_2_Stage];'

    EXEC sys.sp_executesql @SQL;

END

如果您 运行 遇到了一个似乎是陷阱 22 的问题,这很好地表明您使用了错误的方法。

与其删除并重新创建视图,不如使用:

ALTER VIEW vw_tblSage_GLDETAIL_0001
AS
SELECT *  FROM [dbo].[tblSage_GLDETAIL_1_1_Stage]
union 
SELECT *  FROM [dbo].[tblSage_GLDETAIL_1_2_Stage]

改变你的看法。

如果您不能确定视图已经存在(做出这个假设总是好的),那么使用:

CREATE OR ALTER VIEW vw_tblSage_GLDETAIL_0001
AS
SELECT *  FROM [dbo].[tblSage_GLDETAIL_1_1_Stage]
union 
SELECT *  FROM [dbo].[tblSage_GLDETAIL_1_2_Stage]