2014-12-01 44 views
0

當我編寫以下ALTER VIEW語句時,我在SQL Server中收到此錯誤消息。 ALTER VIEW線以紅色下劃線。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

ALTER VIEW將自動覆蓋現有的視圖。所以你先不需要檢查。但是,由於某種原因,如果您想要,SQL Server會告訴您,CREATE/ALTER視圖語句必須是一批語句中的第一個。批次可以由GO分隔。因此,您可以做的是首先刪除視圖(如果存在),然後在批處理中創建視圖。

IF EXISTS(SELECT * FROM sys.views WHERE name = 'SigHierarchyView') 
    Drop View SigHierarchyView 
GO 

CREATE View... 
+1

那麼,如果我們總是需要重新創建它來修改它,那麼擁有ALTER VIEW語句的目的是什麼?我更喜歡不重新創建它,因爲這是許多開發人員的大型應用程序的一部分,如果我這樣做,這個視圖的安全方面也必須重新創建。 – Ray 2014-12-01 16:09:10

+0

你並不總是需要重新創建它。你不需要先放下視圖。 ALTER VIEW將覆蓋現有的視圖定義。我只是認爲你想這樣做是出於某種原因。我更新了我的答案以反映這一點。 – 2014-12-01 16:10:26

+0

您使用dacpac部署嗎? – ChrisBint 2014-12-01 16:16:17

2

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聲明,拋出幾個後衛行代碼之上它,我完成了。

+0

爲什麼所有其他的對象都可以在'BEGIN ... END'子句中創建,但不是視圖?!微軟如此一貫...... – Azimuth 2017-09-05 08:06:19

+0

'BEGIN ... END'表示一個模塊。你可以在模塊中放入任何你想要的邏輯(包括創建臨時表,使用變量等)。一個視圖幾乎侷限於一個'select'語句,所以這就是爲什麼你不下注'BEGIN ... END'的原因。 「一致」!=「以我期望的方式工作」 – 2017-09-05 16:39:39

相關問題