2008-10-02 22 views
94

In Oracle CREATE VIEW, ich eine Ansicht mit einer einzigen Anweisung neu erstellen kann, wie hier gezeigt:SQL Server entsprechen Oracle OR REPLACE

CREATE OR REPLACE VIEW MY_VIEW AS 
SELECT SOME_FIELD 
FROM SOME_TABLE 
WHERE SOME_CONDITIONS 

Wie die Syntax schon sagt, wird dies die alte Ansicht löschen und re-create es mit welcher Definition ich auch gegeben habe.

Gibt es eine Entsprechung in SQL Server 2005, die dasselbe tut?

Antwort

90

Die oben genannten Lösungen, obwohl sie die Arbeit erledigt bekommen, tun dies auf die Gefahr, Benutzerberechtigungen zu verlieren. Ich bevorzuge es, Ansichten oder gespeicherte Prozeduren wie folgt zu erstellen oder zu ersetzen.

IF NOT EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[dbo].[vw_myView]')) 
    EXEC sp_executesql N'CREATE VIEW [dbo].[vw_myView] AS SELECT ''This is a code stub which will be replaced by an Alter Statement'' as [code_stub]' 
GO 

ALTER VIEW [dbo].[vw_myView] 
AS 
SELECT 'This is a code which should be replaced by the real code for your view' as [real_code] 
GO 
+2

Ich war mal ein "Drop" und dann (re) "Add" Person. Aber jetzt lehne ich diese Art von Lösung an (wenn nicht, dann ändern). – granadaCoder

+0

Eine Ansicht zu ändern ist viel besser als sie zu löschen und neu zu erstellen. Was ist, wenn Sie viele Sicherheitseinstellungen für vorhandene Benutzer für eine Ansicht eingerichtet haben, müssen Sie alle diese Elemente neu erstellen. Dies ist mein Ansatz für dieses Problem. – jonas

+0

Ihr ERSTELLEN und ALTER machen verschiedene Dinge .... warum? (Die eine ist dynamisch, die andere nicht, und sie haben unterschiedliche Nachrichten.) –

43

Sie können 'IF EXISTS' verwenden, um zu überprüfen, ob die Ansicht existiert, und sie zu löschen, wenn dies der Fall ist.

 
IF EXISTS (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.VIEWS 
     WHERE TABLE_NAME = 'MyView') 
    DROP VIEW MyView 
GO 

CREATE VIEW MyView 
AS 
    .... 
GO 
+10

Das Problem dabei ist, dass Sie alle Berechtigungen verlieren, die auf dem Objekt existiert haben, die gelöscht wurde. – simon

6

ich verwenden in der Regel etwas wie folgt aus:

if exists (select * from dbo.sysobjects 
    where id = object_id(N'dbo.MyView') and 
    OBJECTPROPERTY(id, N'IsView') = 1) 
drop view dbo.MyView 
go 
create view dbo.MyView [...] 
+0

Dies funktioniert auch mit gespeicherten Prozeduren, Tabellen usw. – Dave

2

Sie können ALTER verwenden, um eine Ansicht zu aktualisieren, aber das ist anders als der Befehl Oracle, da es funktioniert nur, wenn die Sicht bereits vorhanden ist. Wahrscheinlich besser mit DaveKs Antwort, denn das wird immer funktionieren.

+1

Obwohl ALTER vorhandene Berechtigungen behält (und behält die alte Version bei, wenn die neue Version Syntaxfehler usw. hat). Wenn Sie also IF NOT EXISTS ... verwenden, um einen Stub zu erstellen, und ALTER, um ihn/Original zu ersetzen, können Berechtigungen und Abhängigkeiten besser verwaltet werden. – Kristen

12

Ich benutze:

CREATE PROCEDURE dbo.DropView 
@ASchema VARCHAR(100), 
@AView VARCHAR(100) 
AS 
BEGIN 
    DECLARE @sql VARCHAR(1000); 
    IF OBJECT_ID('[' + @ASchema + '].[' + @AView + ']') IS NOT NULL 
    BEGIN 
    SET @sql = 'DROP VIEW ' + '[' + @ASchema + '].[' + @AView + '] '; 
    EXEC(@sql); 
    END 
END 

Ich schreibe

So, jetzt
EXEC dbo.DropView 'mySchema', 'myView' 
GO 
CREATE View myView 
... 
GO 
:

IF OBJECT_ID('[dbo].[myView]') IS NOT NULL 
DROP VIEW [dbo].[myView] 
GO 
CREATE VIEW [dbo].[myView] 
AS 

...

Vor kurzem habe ich einige Hilfsverfahren für diese Art von Sachen hinzugefügt

Ich denke es macht meine Änderungsschreiben ein wenig besser lesbar

4

Ab SQL Server 2016 Sie haben

DROP TABLE IF EXISTS [foo]; 

MSDN source

14

als Referenz von SQL Server 2016 SP1+ Sie CREATE OR ALTER VIEW Syntax verwenden könnte.

MSDN CREATE VIEW:

CREATE [ OR ALTER ] VIEW [ schema_name . ] view_name [ (column [ ,...n ]) ] 
[ WITH <view_attribute> [ ,...n ] ] 
AS select_statement 
[ WITH CHECK OPTION ] 
[ ; ] 

ODER nur

Bedingtes ändert die Ansicht ändern, wenn es bereits vorhanden ist.

+0

Das ist eine Syntax. Sie können nicht beide Schlüsselwörter CREATE AND ALTER gleichzeitig wie ORACLE verwenden. Sie würden unten Fehler erhalten, wenn Sie so versuchen. - Falsche Syntax in der Nähe des Schlüsselwortes 'ODER'. - 'CREATE/ALTER PROCEDURE' muss die erste Anweisung in einem Abfrage-Batch sein. –

+1

@DivTiwari, das ist anscheinend gültig in SQL 2016. Es dauerte nur SQL Server 11 Jahre, um diese Orakel-Funktion aufzuholen, anscheinend :) – JosephStyons

+1

@JosephStyons In der Tat, Sie sind richtig! Ich verstehe nicht, wie sie so ein wichtiges Merkmal so lange vermisst haben. –