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,谢谢你。呜呜!这是急需的东西!