53

CREATE OR REPLACE VIEW似乎在 SQL Server 中不起作用。那么如何移植CREATE OR REPLACE VIEW到 SQL Server 上工作呢?

这就是我想要做的:

CREATE OR REPLACE VIEW data_VVVV AS 
SELECT 
    VCV.xxxx,
        VCV.yyyy AS yyyy,
        VCV.zzzz AS zzzz
FROM 
TABLE_A
;

有任何想法吗?

4

8 回答 8

84

借用@Khan的回答,我会这样做:

IF OBJECT_ID('dbo.test_abc_def', 'V') IS NOT NULL
    DROP VIEW dbo.test_abc_def
GO

CREATE VIEW dbo.test_abc_def AS
SELECT 
    VCV.xxxx
    ,VCV.yyyy AS yyyy
    ,VCV.zzzz AS zzzz
FROM TABLE_A

MSDN 参考

于 2014-10-10T23:05:57.850 回答
55

这是另一种方法,您不必复制视图的内容:

IF (NOT EXISTS (SELECT 1 FROM sys.views WHERE name = 'data_VVV'))
BEGIN
    EXECUTE('CREATE VIEW data_VVVV as SELECT 1 as t');
END;

GO

ALTER VIEW data_VVVV AS 
    SELECT VCV.xxxx, VCV.yyyy AS yyyy, VCV.zzzz AS zzzz FROM TABLE_A ;

第一个检查视图是否存在(还有其他方法可以做到这一点)。如果它不存在,那么用一些简单而愚蠢的东西来创建它。如果是这样,那么只需继续alter view声明即可。

于 2013-08-30T14:16:14.410 回答
42

SQL Server 2016 答案

使用 SQL Server 2016,您现在可以执行以下操作(MSDN Source):

DROP VIEW IF EXISTS dbo.MyView

或者(MSDN Source):

CREATE OR ALTER VIEW dbo.MyView
于 2016-02-17T10:30:35.413 回答
16

编辑:虽然这个问题已被标记为重复,但它仍然受到关注。@JaKXz 提供的答案是正确的,应该是公认的答案。


您需要检查视图是否存在。然后根据结果做一个CREATE VIEW或。ALTER VIEW

IF OBJECT_ID('dbo.data_VVVV') IS NULL
BEGIN
    CREATE VIEW dbo.data_VVVV
    AS
    SELECT VCV.xxxx, VCV.yyyy AS yyyy, VCV.zzzz AS zzzz FROM TABLE_A VCV
END
ELSE
    ALTER VIEW dbo.data_VVVV
    AS
    SELECT VCV.xxxx, VCV.yyyy AS yyyy, VCV.zzzz AS zzzz FROM TABLE_A VCV
BEGIN
END
于 2013-08-30T14:13:36.947 回答
9

公认的解决方案存在需要两次维护相同语句的问题,它不是很有效(尽管它有效)。理论上 Gordon Linoff 的解决方案是可行的,但它在 MSSQL 中不起作用,因为 create view 必须是批处理中的第一行。

删除/创建没有回答提出的问题。以下根据原始问题完成工作。

if not exists (select * from sysobjects where name='TABLE_A' and xtype='V')
exec ('create view SELECT 
VCV.xxxx,
    VCV.yyyy AS yyyy,
    VCV.zzzz AS zzzz
FROM TABLE_A')
于 2016-01-31T22:13:26.630 回答
3

这样的事情怎么样,评论应该解释:

--DJ - 2015-07-15 Example for view CREATE or REPLACE

--Replace with schema and view names
DECLARE @viewName NVARCHAR(30)= 'T';
DECLARE @schemaName NVARCHAR(30)= 'dbo';

--Leave this section as-is
BEGIN TRY
    DECLARE @view AS NVARCHAR(100) = '
CREATE VIEW ' + @schemaName + '.' + @viewName + ' AS SELECT '''' AS [1]';
    EXEC sp_executesql
        @view;
END TRY
BEGIN CATCH
    PRINT 'View already exists';
END CATCH;
GO

--Put full select statement here after modifying the view & schema name appropriately
ALTER VIEW [dbo].[T]
AS
    SELECT  '' AS [2];
GO


--Verify results with select statement against the view
SELECT  *
FROM    [T];

干杯-DJ

于 2015-07-15T08:23:45.500 回答
0

可以通过删除视图并重新创建它来更改视图。使用以下内容删除并重新创建您的视图。

IF EXISTS
(SELECT NAME FROM SYS.VIEWS WHERE NAME = 'dbo.test_abc_def')
DROP VIEW dbo.test_abc_def) go

CREATE VIEW dbo.test_abc_def AS
SELECT 
    VCV.xxxx, 
    VCV.yyyy AS yyyy
    ,VCV.zzzz AS zzzz
FROM TABLE_A
于 2016-05-15T06:21:46.570 回答
-2
IF NOT EXISTS(select * FROM sys.views where name = 'data_VVVV ')
    BEGIN
        CREATE VIEW data_VVVV AS 
        SELECT VCV.xxxx, VCV.yyyy AS yyyy, VCV.zzzz AS zzzz FROM TABLE_A VCV
    END
ELSE
    BEGIN
        ALTER VIEW data_VVVV AS 
        SELECT VCV.xxxx, VCV.yyyy AS yyyy, VCV.zzzz AS zzzz FROM TABLE_A VCV
    END
于 2013-08-30T14:10:12.570 回答