2016-11-30 71 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);