Sql 使用存在性检查创建视图

Sql 使用存在性检查创建视图,sql,sql-server,Sql,Sql Server,我正在尝试这样做: 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'必须是批处理中的唯一语句”错误 我已经尝试了(使用BEGIN/END)和(使用GO语句,使用动态SQL)的建议,

我正在尝试这样做:

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'必须是批处理中的唯一语句”错误


我已经尝试了(使用BEGIN/END)和(使用GO语句,使用动态SQL)的建议,但没有一个能缓解错误。

试试这个逻辑,你的有点不对劲

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

您目前不太可能使用SQL 2016 SP1,但对于后代来说,您现在可以这样做了

创建或更改视图

可能是这样的:

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);

输入(N'U')
正在检查表而不是视图。如果修复了这个问题,动态SQL将正常工作。我不会建议这种拖放创建方法。如果视图被绑定到某个地方,它很容易被破坏。而且-非常讨厌您可能会丢失连接授权…当然,这取决于应用程序。我为一家软件供应商工作,这是我们特定实例的最佳方式。显然,一切都应该首先在开发环境中进行测试。@Rich:是的,我也想放弃,但在调试过程中删除了它。:-)有一次我在客户的系统上这样做了。一切都很好。但有一个跨系统的工作我不知道。特别授予的授权已经消失,附近没有服务器管理员。。。太糟糕了…@Shnugo,谢谢你。呜呜!这是急需的东西!