2013-08-30 25 views

Odpowiedz

10

Edit: Choć kwestia ta została oznaczona jako duplikat wciąż przyciąga uwagę. Odpowiedź udzielona przez @JaKXz jest poprawna i powinna być zaakceptowaną odpowiedzią.


Musisz sprawdzić, czy istnieje widok. Następnie wykonaj CREATE VIEW lub ALTER VIEW w zależności od wyniku.

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

Powoduje to powtarzanie instrukcji select, dzięki czemu naprawdę podwoisz ilość kodu, o którym musisz pomyśleć. Odpowiedź JaKXz poniżej jest lepszą aplikacją. – JustEngland

+22

To nie działa w SQL Server. "Utwórz widok" musi być pierwszym w grupie i kiedy próbuję umieścić go w środku 'JEŻELI', otrzymuję 'Niepoprawna składnia w pobliżu słowa kluczowego 'WYŚWIETL.'". – trailmax

+0

Musisz zawinąć instrukcję CREATE do EXEC ("twoja instrukcja tworzenia")). W przeciwnym razie nie będzie działać w IF. –

-1

Aby utworzyć widok w SQL, Oto składnia:

CREATE VIEW view_name AS 

i zmieniać składnię pogląd jest:

ALTER VIEW view_name as 
+0

Nie odpowiada na pytanie (jedno polecenie dla obu). –

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

Ponadto alias VCV nie jest nigdzie ustawiony. –

+0

@ mr.Reband Good Point –

+0

Nie działa w SQL Server. Skopiuj i wklej to zapytanie do SSMS, naciśnij przycisk Wykonaj (lub Analizuj) i powiedz, co otrzymujesz. – clamum

24

Oto kolejny sposób, gdzie nie trzeba powielać zawartości widzenia:

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 ; 

Pierwsze sprawdza istnienie widzenia (istnieją inne sposoby, aby to zrobić). Jeśli nie istnieje, utwórz go z czymś prostym i głupim. Jeśli tak, po prostu przejdź do instrukcji alter view.

+2

To nie działa. SQL Server narzeka, że ​​CREATE VIEW musi być pierwszą linią w zestawie instrukcji. Odpowiedź poniżej, że najpierw opuszcza widok działa. –

44

Pożyczanie od @ odpowiedź Khana, chciałbym zrobić:

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 Reference

+1

W Oracle "utwórz lub zamień" jest atomowy, więc nie ma przestojów i możesz zaktualizować widok bez problemów, nawet gdy aplikacja chce zapytać o widok. –

+4

'DROP' i następujące' CREATE' spowoduje usunięcie danych meta, takich jak przyznane prawa. Na serwerze SQL, w którym nie jesteś SA, może to być bardzo złe ... – Shnugo

4

Jak o czymś takim, komentarze powinny wyjaśnić:

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

8

Przyjęte rozwiązanie ma problem z adresem d, aby zachować to samo oświadczenie dwa razy, nie jest bardzo wydajne (choć działa). Teoretycznie rozwiązanie Gordona Linoffa byłoby udane, z wyjątkiem tego, że nie działa w MSSQL, ponieważ widok tworzenia musi być pierwszą linią w partii.

Upuść/utwórz nie odpowiada na pytanie jako postawione. Poniższe czynności są wykonywane zgodnie z pierwotnym pytaniem.

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

To działa poprawnie, a wyjaśnienie pomogło, dlaczego dostałem komunikaty o błędach, gdy próbowałem użyć podejścia akceptowanej odpowiedzi. – trailmax

+0

Jeszcze lepiej może być utworzenie (w przypadku braku obecności) WIDOKU z "manekinem SELECT 1 AS" i pozwolić, aby "prawdziwa" definicja VIEW nastąpiła po "GO" z "ALTER" ... – Shnugo

14

SQL Server 2016 Answer

SQL Server 2016 można teraz zrobić (MSDN Source):

DROP VIEW IF EXISTS dbo.MyView 
0

Zmiana widoku można osiągnąć poprzez upuszczenie widok i odtworzenie go. Użyj poniższego, aby upuścić i ponownie utworzyć widok.

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