如何在存储过程中插入多个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]
我意识到我不能在存储过程中使用 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]