Как заставить CREATE или REPLACE VIEW работать в SQL Server? [дубликат]
этот вопрос уже есть ответ здесь:
CREATE OR REPLACE VIEW
не работает в SQL Server. Так как же мне port 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
;
какие идеи?
8 ответов
Edit: хотя этот вопрос был отмечен как дубликат, он по-прежнему привлекает внимание. Ответ, предоставленный @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
заимствуя из ответа @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
вот еще один метод, где вам не нужно дублировать содержимое представления:
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
заявление.
SQL Server 2016 ответ
С SQL Server 2016 теперь вы можете сделать (источник MSDN):
DROP VIEW IF EXISTS dbo.MyView
принятое решение имеет проблему с необходимостью поддерживать одно и то же утверждение дважды, оно не очень эффективно (хотя и работает). Теоретически решение Гордона Линоффа было бы go, за исключением того, что оно не работает в MSSQL, потому что create view должен быть первой строкой в пакете.
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')
Как насчет чего-то подобного, комментарии должны объяснить:
--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];
Ура -Ди-джей
изменение представления может быть выполнено путем удаления представления и его воссоздания. Используйте следующее, Чтобы удалить и воссоздать представление.
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
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