ALTER VIEW必须是批处理中唯一的语句

时间:2014-12-01 15:55:22

标签: sql-server tsql

当我编写以下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。

2 个答案:

答案 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...