我意識到我不能在存盤程序中使用 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
uj5u.com熱心網友回復:
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
uj5u.com熱心網友回復:
如果您遇到似乎是第 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]
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/425356.html
