Подтвердить что ты не робот

Как сделать работу CREATE или REPLACE VIEW в SQL Server?

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
;

Любые идеи?

4b9b3361

Ответ 1

Изменить: хотя этот вопрос был отмечен как дубликат, он все еще привлекает внимание. Ответ, предоставленный @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

Ответ 2

Заимствование из ответа @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

Ответ 3

Вот еще один способ, когда вам не нужно дублировать содержимое представления:

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

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

Первая проверяет наличие вида (есть и другие способы сделать это). Если этого не существует, то создайте его с чем-то простым и немым. Если это так, просто перейдите к инструкции alter view.

Ответ 4

Ответ SQL Server 2016

С SQL Server 2016 вы теперь можете сделать (Источник MSDN):

DROP VIEW IF EXISTS dbo.MyView

Ответ 5

В принятом решении есть проблема с необходимостью поддерживать один и тот же оператор дважды, он не очень эффективен (хотя он работает). Теоретически решение Gordon Linoff будет идти, за исключением того, что оно не работает в MSSQL, потому что создание представления должно быть первой строкой в ​​партии.

Функция drop/create не отвечает на поставленный вопрос. Следующее выполняет задание в соответствии с исходным вопросом.

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

Ответ 6

Как насчет чего-то подобного, комментарии должны объяснять:

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

Ответ 7

Изменение представления может быть достигнуто путем сброса представления и его воссоздания. Используйте следующее, чтобы отбросить и воссоздать ваше представление.

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

Ответ 8

Чтобы создать представление в SQL, выполните следующий синтаксис:

 CREATE VIEW view_name AS

и изменить синтаксис представления:

 ALTER VIEW view_name as

Ответ 9

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