web-dev-qa-db-fra.com

Comment faire CREER OR REPLACE VIEW fonctionne-t-il dans SQL Server?

CREATE OR REPLACE VIEW ne semble pas fonctionner dans SQL Server. Alors, comment puis-je porter CREATE OR REPLACE VIEW pour travailler sur SQL Server?

C'est ce que j'essaie de faire:

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

Des idées?

28
Alex

Edit: Bien que cette question a été marquée comme un doublon, il a toujours attiré l'attention. La réponse fournie par @JaKXz est correcte et devrait être la réponse acceptée.  


Vous devrez vérifier l'existence de la vue. Ensuite, faites un CREATE VIEW ou ALTER VIEW en fonction du résultat.

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

Empruntant à la réponse de @ Khan, je ferais: 

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

Référence MSDN

60
JaKXz

Voici une autre méthode, dans laquelle vous n'avez pas à dupliquer le contenu de la vue:

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 ;

La première vérifie l'existence de la vue (il existe d'autres moyens de le faire). S'il n'existe pas, créez-le avec quelque chose de simple et idiot. Si c'est le cas, passez simplement à l'instruction alter view.

35
Gordon Linoff

Réponse de SQL Server 2016

Avec SQL Server 2016, vous pouvez maintenant faire ( MSDN Source ):

DROP VIEW IF EXISTS dbo.MyView
23
Muhammad Rehan Saeed

La solution acceptée pose un problème avec la nécessité de conserver deux fois la même déclaration, elle n’est pas très efficace (bien que cela fonctionne). En théorie, la solution de Gordon Linoff serait la solution idéale, sauf que cela ne fonctionne pas dans MSSQL car la vue create doit être la première ligne d'un lot.

Le drop/create ne répond pas à la question telle que posée. Ce qui suit fait le travail selon la question initiale.

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

Que diriez-vous de quelque chose comme ça, les commentaires devraient expliquer:

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

Cheers - DJ

3
Dustin Jones

Pour modifier une vue, vous pouvez la supprimer et la recréer. Utilisez ce qui suit pour supprimer et recréer votre vue.

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