2016-11-30 41 views
1

我試圖做到這一點:CREATE VIEW與生存確認

IF NOT EXISTS (
SELECT * 
FROM sys.objects 
WHERE object_id = OBJECT_ID(N'[dbo].[viewName]') 
AND type in (N'U') 
) 

CREATE VIEW [dbo].[viewName] AS 
-- Such and such 
GO 

這將引發「‘CREATE VIEW’必須是唯一的語句在批處理」的錯誤。

我已經嘗試了here(使用BEGIN/END環繞)和here(使用GO語句,使用動態SQL)的建議,但都沒有減輕錯誤。

+2

輸入(N'U')'正在檢查表格而不是視圖。修復和動態SQL將工作 –

回答

1

試試這個邏輯,你的一點關閉;

IF NOT EXISTS (SELECT * FROM dbo.sysobjects WHERE object_id= object_id(N'[dbo].[ViewName]') AND OBJECTPROPERTY(object_id, N'IsView') = 1) 

我說實話,我總是放棄並重新創建,以確保您運行的是最新版本的視圖,像這樣;

IF EXISTS (SELECT * FROM dbo.sysobjects WHERE object_id= object_id(N'[dbo].[ViewName]') AND OBJECTPROPERTY(object_id, N'IsView') = 1) 
BEGIN 
    DROP VIEW [dbo].ViewName 
END 
GO 

CREATE VIEW ViewName 
AS 
    SELECT 

是的,所以檢查您要使用動態SQL的評論;

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[viewName]') AND OBJECTPROPERTY(object_id, N'IsView') = 1) 
BEGIN 
DECLARE @sql nvarchar(MAX) 
--SELECT 'Do this mofo' 
SET @sql = N'CREATE VIEW [dbo].[viewName] 
      AS 
      SELECT COUNT(1) FieldName FROM sys.objects' 

EXEC sp_executesql @sql 

END 
GO 
+0

我不會建議這個* DROP和CREATE * -approach。如果視圖被綁定在某個地方,它很容易破壞。而且 - 非常煩人! - 您可能會失去連接的GRANT ... – Shnugo

+0

當然,這一切都取決於應用程序。我爲軟件供應商工作,這是我們特定實例的最佳方式。首先,顯然應該在開發環境中測試所有東西。 –

+0

@Rich:是的,我也想放棄它,但作爲調試的一部分,它已經刪除它。 :-) – Francho

2

可能是這樣的:

DECLARE @cmd NVARCHAR(MAX)=N'CREATE VIEW ....;'; 

IF EXISTS(SELECT 1 FROM INFORMATION_SCHEMA.VIEWS AS v WHERE v.TABLE_NAME='ViewName') --yes, it's TABLE_NAME! 
    SET @cmd=STUFF(@cmd,1,6,N'ALTER'); 

EXEC(@cmd);