当我编写以下ALTER VIEW语句时,我在SQL Server中收到此错误消息。 ALTER VIEW行以红色下划线标出。
IF EXISTS(SELECT * FROM sys.views WHERE name = 'SigHierarchyView')
ALTER VIEW [dbo].[SigHierarchyView] WITH SCHEMABINDING AS
(
SELECT [Sig].[Id]
,[Sig].[UniqueId]
,[Sig].[TenantId] AS [ParentTenantId]
,[Sig].[Code_FR]
,[Sig].[Code_EN]
,[Sig].[DecodedText_FR]
,[Sig].[DecodedText_EN]
,[Sig].[DecodedText_ES]
,[Sig].[DecodedText_IT]
,[Sig].[DecodedText_VI]
,[Sig].[DecodedText_CH]
,[Sig].[Timestamp]
,[Sig].[Deleted]
,[Sig].[CreationDate]
,[Sig].[CreationUserUniqueId]
,[Sig].[ModificationDate]
,[Sig].[ModificationUserUniqueId]
,TenantHierarchy.[LeafTenantId] AS [TenantId]
FROM dbo.[Sig]
INNER JOIN dbo.TenantHierarchy ON [Sig].TenantId = TenantHierarchy.ParentTenantId
WHERE TenantHierarchy.Level = (
SELECT MIN(TenantHierachieIn.Level)
FROM dbo.TenantHierarchy TenantHierachieIn
INNER JOIN dbo.[Sig] as SigIn
ON SigIn.TenantId = TenantHierachieIn.ParentTenantId
AND SigIn.UniqueId = [Sig].UniqueId
WHERE TenantHierachieIn.[LeafTenantId] = TenantHierarchy.[LeafTenantId]
)
)
GO
我尝试了BEGIN和END,但这并没有帮助。我使用的是SQL Server 2012。
答案 0 :(得分:5)
SQL Server中的批处理由“GO”关键字分隔。由于您的脚本中没有任何内容,因此所有内容都在一个批处理中。而且,正如您已经发现的那样,alter view
需要在其自己的批次中。我喜欢用来防止这种情况的一个成语如下:
if object_id('[dbo].[myView]') is not null --object exists
set noexec on;
go
-- this will only get run if the object doesn't exist
create view [dbo].[myView]
as
select 'stub' as message
go
set noexec off;
go
alter view [dbo].[myView]
as
-- actual view definition here
这样,我可以使用SSMS中的脚本来编写alter view
语句的脚本,在它上面抛出几行保护代码,然后就完成了。
答案 1 :(得分:0)
ALTER VIEW将自动覆盖现有视图。所以你不需要先检查。但是,出于某种原因,如果您愿意,SQL Server会告诉您CREATE / ALTER视图语句必须是批处理语句中的第一个。批次可以由GO分隔。因此,您可以做的是首先删除视图(如果存在),批量创建视图,然后在新批处理中创建视图。
IF EXISTS(SELECT * FROM sys.views WHERE name = 'SigHierarchyView')
Drop View SigHierarchyView
GO
CREATE View...